Liste des cours‎ > ‎

Serveur de discussion avec 0MQ (pour le 10 octobre)

Il existe des programmes informatique qui fonctionnent en isolation, sans utiliser le réseau. Étant dans une école de télécommunications, il nous paraît utile de faire communiquer différents programmes pour illustrer l'intérêt et les problématiques de la communication entre entités distinctes.

Plutôt que d'utiliser des sockets BSD, qui sont assez primitives, nous avons choisi d'utiliser le framework 0MQ qui offre de nombreux avantages :
  • communications unidirectionnelles ou bi-directionnelles ;
  • communications pair-à-pair ou communications de groupe ;
  • système publish / subscribe ;
  • bindings dans de nombreux langages, dont ceux que nous utiliserons pour le projet (C, Java) ;
  • disponible sur la plupart des systèmes d'exploitation.

Pour utiliser la bibliothèque JZMQ depuis un programme Java, il faut, en salle A405, rajouter dans le classpath l'archive /usr/local/share/java/zmq.jar. Cela est nécessaire pour que le compilateur et la machine virtuelle trouvent les classes référencées dans cette archive.

Si vous êtes curieux et souhaitez savoir ce que contient cette archive, vous pouvez le voir en utilisant la commande suivante :

jar tvf /usr/local/share/java/zmq.jar

Définition du problème

Nous souhaitons mettre en place un serveur de chat, permettant à différents programmes de parler ensemble. Pour cela, nous avons mis en place un service utilisant 0MQ qui publie sur une socket de type PUB tout ce qu'elle reçoit sur une socket de type PULL.

Les adresses sur lesquelles le serveur est disponible sont :
  • pour envoyer un message : tcp://arrakis.enst.fr:4161 (depuis une socket en mode PUSH)
  • pour recevoir les messages : tcp://arrakis.enst.fr:4162 (depuis une socket en mode SUB)
Les messages échangés sont de la forme suivante : NOM|TEXTE

Par exemple, le message

Sam|Je teste le protocole


est un message envoyé par "Sam" contenant la chaîne" Je teste le protocole".

Premier exercice

Écrire un programme Receiver qui affiche sur la sortie standard tous les messages envoyés par les participants. Le format de sortie devra être similaire à (une ligne par message reçu) :

NOM wrote: TEXTE


Attention à ne pas oublier de souscrire au message vide afin de recevoir les informations depuis la socket 0MQ. Oublier de souscrire est la cause d'erreur la plus fréquente lors de l'utilisation de sockets en mode SUB.

Deuxième exercice

Écrire un programme Sender qui prend deux arguments sur la ligne de commande, un nom et un message, et qui l'envoie au serveur (avec une socket en mode PUSH). Il devra être possible d'écrire, par exemple :

java Sender Sam "Je teste le protocole"

ce qui provoquera l'envoi de la chaîne suivante au serveur :

Sam|Je teste le protocole

Troisième exercice

Écrire un programme Robot prenant en argument sur la ligne de commande son nom, qui, lorsqu'il s'aperçoit qu'on lui parle (s'il trouve son nom dans le texte envoyé par quelqu'un), répète la phrase en la mettant à l'envers (le premier caractère devient le dernier, etc.).

Par exemple, si le robot appelé "SamBot" reçoit du serveur la chaîne suivante :

Sam|Coucou SamBot


il devra renvoyer au serveur

SamBot|toBmaS uocuoC