Skip to content

Azkela/Microblogage

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Ce projet a été réalisé par :

SANCHEZ Nicolas FATEH Nacer

Compilation et exécution :

Exécuter la classe MicroblogClient en indiquant le nom d'utilisateur puis choisir le mode souhaité à l'aide du menu affiché ( 1: publish, 2: subscribe, 3: unsubscribe, 4: EXIT)

Protocole microblogamu

L'application est une application de microblogage (ou gazouillage). Les utilisateurs peuvent poster des courts messages, lire les derniers messages postés, s'abonner à d'autres utilisateurs (auquel cas ils reçoivent les messages de ces utilisateurs) et s'en désabonner. Les messages peuvent contenir des mots-clés (tags), et l'on peut consulter les messages récents contenant un mot-clé donné, ainsi que s'abonner/se désabonner à des/de mots-clés.

Les utilisateurs sont identifiés par un nom : suite de caractÚres alphanumériques sans espace commençant par @ (e.g., @alice, @B42r115). Un mots-clé est une suite de caractÚres alphanumériques sans espace commençant par # (hashtag).

Les messages de l'application ont chacun un identifiant unique id sur 64 bits. Cet identifiant est attribué par le serveur. Le contenu d'un message est limité à 256 caractÚres.

Le port par défaut de microblogamu est 12345.

RequĂȘtes/rĂ©ponses

L'interaction avec le serveur s'effectue soit en mode non-connectĂ© par des Ă©changes de type requĂȘte/rĂ©ponse, soit par en mode connectĂ© (voir plus bas). Chaque requĂȘte donne lieu Ă  l'ouverture d'une nouvelle connexion, qui est fermĂ©e une fois la rĂ©ponse obtenue. Une requĂȘte ou une rĂ©ponse se compose d'un entĂȘte (header) et d'un corps (body). L'entĂȘte permet d'identifier la requĂȘte et contient ses paramĂštres tandis le que le corps est formĂ© de son contenu (qui peut-ĂȘtre vide). L'entĂȘte et le corps sont terminĂ©s par une retour chariot (carriage return) suivi de fin de ligne (linefeed), e.g. \r\n. Si le corps est vide, la requĂȘte ou rĂ©ponse se termine donc par \r\n\r\n.

Typiquement, une connexion est Ă©tablie Ă  l'initiative du client, qui ensuite envoie la requĂȘte. La connexion est fermĂ©e une fois la rĂ©ponse transmise (cotĂ© serveur)/reçue (cotĂ© client).

RequĂȘtes

Publier un message

entĂȘte : PUBLISH author:@user corps : contenu du message rĂ©ponse :OK ou ERROR @user est l'auteur du message. Le serveur renvoie une rĂ©ponse OK ou ERROR dĂ©crite plus bas.

Recevoir des identifiants de messages

entĂȘte : RCV_IDS [author:@user] [tag:#tag] [since_id:id] [limit:n] corps: vide rĂ©ponse: le serveur renvoie une rĂ©ponse MSG_IDS contenant les identifiants des n messages les plus rĂ©cents correspondant aux critĂšres de la requĂȘte. Les identifiants sont ordonnĂ©s par ordre antichronologiques (les plus rĂ©cents en premier). (optionnel) author:@user l'auteur des messages est @user (optionnel) tag:#tag les messages contiennent le mot clĂ© #tag (optionnel) since_id:id les messages ont Ă©tĂ© publiĂ©s aprĂšs le message dont l'identifiant est id (optionnel) limit:n aux plus n identifiants sont renvoyĂ©s. La valeur par dĂ©faut de n est n=5. Ainsi, la requĂȘtes RCV_IDS dĂ©clenchera une rĂ©ponse MSG_IDS contenant les identifiants des 5 derniers messages publiĂ©s, les identifiants des messages les plus rĂ©cents en premier.

Recevoir un message

entĂȘte : RCV_MSG msg_id:id corps : vide rĂ©ponse : le serveur renvoie une rĂ©ponse MSG contenant le message dont l'identifiant est id ou ERROR si il n'existe pas de message dont l'identifiant est id.

Publier un message en réponse à un autre

entĂȘte : REPLY author:@user reply_to_id:id corps : contenu du message rĂ©ponse :OK ou ERROR Le message est publiĂ© en rĂ©ponse au message dont l'identifiant est id Le serveur renvoie une rĂ©ponse OK ou ERROR.

Re-publier un message

entĂȘte : REPUBLISH author:@user msg_id:id corps : vide rĂ©ponse :OK ou ERROR Le message dont l'identifiant est id est publiĂ© de nouveau.

RĂ©ponses

Ces rĂ©ponses sont Ă©mises par le serveur en retour d'une requĂȘte

Confirmation de publication

entĂȘte :OK corps: vide renvoyĂ©e suite Ă  une requĂȘte de publication d'un message

Signalement d'une erreur

entĂȘte : ERROR corps : message d'erreur Exemples de messages d'erreur : Bad request format, Unknown message id, etc .

Liste d'identifiants de messages :

entĂȘte : MSG_IDS corps : identifiants de messages, un par ligne, ordonnĂ©es par les plus rĂ©cents en premier. Message

entĂȘte : MSG author:@user msg_id:id [reply_to_id:id] [republished:true/false]. L'entĂȘte contient les mĂ©ta-donnĂ©es du message, i.e. le nom de l'auteur, son identifiant, s'il s'agit d'un republication ou d'une rĂ©ponse Ă  un autre message. Les couples key:value sont sĂ©parĂ©s par un ou plusieurs espaces. Les couples entre crochet [ ] sont optionnels. corps : le contenu du message. Mode flux Le mode requĂȘte/rĂ©ponse requiert l'Ă©tablissement d'une nouvelle connexion pour la rĂ©ception de chaque nouveau message. De plus le client a la charge de pĂ©riodiquement de demander au serveur les messages qui l'intĂ©ressent. Dans le mode flux, le serveur notifie le client Ă  chaque fois qu'un nouveau message pour lequel le client a manifestĂ© de l'intĂ©rĂȘt est publiĂ©.

Se connecter

entĂȘte : CONNECT user:@user corps : vide rĂ©ponse : OK ou ERROR. Cette requĂȘte dĂ©clenche l'ouverture d'une connexion avec le serveur sur laquelle sera transmis le flux de messages auquel s'abonne le client. La gestion des abonnements se fait au moyen des requĂȘtes SUBSCRIBE et UNSUBSCRIBE.

S'abonner

entĂȘte : SUBSCRIBE author:@user et SUBSCRIBE tag:#tag corps : vide rĂ©ponse : OK ou ERROR. Le serveur envoie ERROR si @user n'est pas gĂ©rĂ© par l'application. Si par contre le mot-clĂ© #tag n'est pas encore gĂ©rĂ©, il est ajoutĂ© et OK est renvoyĂ©. Suite Ă  cette requĂȘte, le serveur enverra une rĂ©ponse MSG sur la connexion prĂ©cĂ©demment ouverte par CONNECT Ă  chaque fois qu'un message dont l'auteur est @user ou qui contient le mot-clĂ© #tag est publiĂ©.

Se désabonner

entĂȘte : UNSUBSCRIBE author:@user et UNSUBSCRIBE tag:#tag corps : vide rĂ©ponse : OKou ERROR. Le serveur renvoie ERROR si le client n'est pas abonnĂ© Ă  @user ou au mot-clĂ© #tag. Suite Ă  cette requĂȘte, le serveur cesse d'envoyer des messages dont l'auteur est @user ou qui contiennent le mot-clĂ© #tag.

Serveur centralisé

On commencera par un service centralisé correspondant à un seul serveur.

Serveur rudimentaire

Écrire un serveur rudimentaire qui rĂ©pond aux requĂȘtes PUBLISH. Les messages reçues via les requĂȘte PUBLISH seront affichĂ©s avec leur identifiant sur la sortie standard. Écrire un premier client publisher qui : Demande un pseudo (@user) Ă  l'utilisateur Attend les messages de l'utilisateur (sur l'entrĂ©e standard) Transmet les messages de l'utilisateur au serveur Valider votre client et votre serveur avec netcat.

Serveur non-connecté complet

ComplĂ©ter votre serveur pour rĂ©pondre aux requĂȘtes RCV_IDS et RCV_MSG Écrire un deuxiĂšme client follower qui RĂ©cupĂšre les identifiants des messages d'un ou plusieurs utilisateurs (spĂ©cifiĂ©s au lancement du client) Affiche le contenu des messages correspondant Ă  ces identifiants. Vous avez le choix de l'architecture du serveur : utilisation de select, d'un pool de threads ou combinaison des deux. On fera attention Ă  l'unicitĂ© des identifiants des messages, ainsi qu'Ă  l'ordre dans lequel les messages sont affichĂ©s.

Finaliser votre serveur en ajoutant la gestion des requĂȘtes REPLY et REPUBLISH. Écrire un client repost qui re-publie chaque message Ă©mis par un ensemble d'utilisateurs dĂ©terminĂ© au lancement du client. Valider votre serveur avec plusieurs clients. Gestion des flux Nous allons maintenant Ă©crire le serveur MicroblogCentral, qui en plus en plus du mode requĂȘte/rĂ©ponse supportera la gestion des flux d'abonnement.

Proposer une architecture fondée sur des files d'attente associées à chaque client abonné à des mots-clés et/ou utilisateurs. On pourra utiliser ces files en mode producteur/consommateur : * Les producteurs placent dans les files concernées les nouveaux messages publiés. * Il y a un seul consommateur par file, qui renvoie dans la socket du client les messages présents dans la file d'attente associée à ce client.

On pourra utiliser les implémentations ArrayBlockingQueue ou ConcurrentLinkedQueue.

Comment s'assurer que la communication est asynchrone ?

Proposer une validation fonctionnelle basée sur des tests automatisés avec plusieurs clients.

Écrire le serveur MicroblogCentral.

Écrire un client complet MicroblogClient. Il lira sur l'entrĂ©e standard les commandes de l'utilisateur (PUBLISH, REPLY, REPUBLISH, (UN)SUBSCRIBE) avec leur entrĂ©e. Il affichera les messages reçus prĂ©cĂ©dĂ©s de leur auteur et de leur identifiant.

About

🌐 Application rĂ©seau de microblogage

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages