CSC 4509 – Algorithmique et communications des applications réparties

Portail informatique

Communication datagram

  • Communication entre processus avec les DatagramChannel de JAVA NIO.

Dans ce TP, vous réalisez deux exercices :

  • le premier service consiste à comprendre et à tester deux programmes qui échangent des datagrams ;
  • pour le second, vous modifiez un peu ces programmes pour mettre en lumière certains aspects du service d'UDP.

Communication en mode « échange de messages »

Préparation

Pour ce TP nous utiliserons le projet csc4509-2-datagram déjà importé sur votre IDE depuis le premier TP.

Exécution

Dans la paquetage dgram, vous trouvez deux classes :

  • MainNioRecv  le serveur qui attend la réception d'un message ;
  • MainNioSend : le client qui envoie un message (un datagram) au serveur.

Exécutez les deux classes après avoir modifié dans la configuration d'exécution la liste des arguments de manière à introduire un numéro de port égal à 20000 plus votre numéro de poste.

Le serveur accepte comme argument le numéro de port auquel il s'associe. Le client accepte comme arguments le nom de la machine cible, le numéro de port et la taille du message à envoyer.

Compréhension

Lisez le code source et comprenez les différentes étapes :

  1. dans la classe MainNioRecv :
    • repère 1 : création du point de communication et association avec le numéro de port de réception ;
    • repère 2 : création du buffer de réception de taille prédéfinie ;
    • repère 3 : réception du datagram ;
  2. dans la classe MainNioSend :
    • repère 1 : création du buffer de réception de taille connue à partir des arguments ;
    • repère 2 : création du point de communication ;
    • repère 3 : recherche de l'adresse IP du serveur ;
    • repère 4 : préparation du port cible sur le serveur ;
    • repère 5 : envoi du datagram.

Taille des datagrams

Faites plusieurs essais pour trouver la taille limite du datagram qui sera correctement transmis sur la même machine, puis entre deux machines différentes. Pour travailler avec une autre machine, vous pouvez vous connecter sur le serveur ssh.int-evry.fr (ssh ssh) puis lancer votre application en ligne de commande.

Pour lancer les applications en ligne de commande, vous disposez de deux procédés :

  • vous profitez du fichier de configuration de Maven qui propose, grâce au greffon exec-maven-plugin, des choix d'éxécutions prédéfinis. Ces choix sont listés dans le fichier readme.md à la racine du projet ;
  • vous utilisez les shell-scripts que vous pourrez régler selon vos préférences.

Si vous décidez d'écrire vos propres shell-scripts, vous pouvez vous inspirer de ceux qui sont déjà offerts. Dans ces shell-scripts, il faudra que votre variable CLASSPATH contienne toutes les informations pour que la commande java retouve tout le code que vous utilisez, c'est-à-dire :

  • la classe que vous voulez utiliser et les paquetages qu'elle utilise ;
  • les bibliothèques que cette classe utilise.

La seule bibliothèque utilisée dans ce TP est Log4j. Maven range toutes les bibliothèques dans un répertoire à la racine de votre compte (~/.m2/repository), et il a placé vos classes dans le répertoire target/classes à la racine du projet. Donc le shell-scipt pour lancer le serveur ressemble à :

Attention, les machines sont controlées par des firewalls et vous devez placer votre serveur sur ssh et votre client sur votre machine de salle de TP : l'inverse, serveur sur votre poste de travail, ne fonctionne pas.

Émissions et réceptions multiples

Dans ce paquetage ndgram, vous trouverez deux copies des classes précédentes renommées MainNioRecvN et MainNioSendN.

Modifiez la classe MainNioSendN pour qu'elle puisse émettre un groupe de n messages (n étant passé en quatrième argument du programme), suivi d'un dernier message vide.

Modifiez la classe MainNioSendN pour qu'elle reçoive en boucle les messages qui lui sont émis jusqu'à recevoir un message vide. Ajoutez un compteur des messages reçus.

Constatez que des pertes de messages peuvent se produire entre processus sur une même machine aussi bien qu'entre deux machines. Par exemple, envoyez des messages de grande taille ou beaucoup de messages de petite taille.

 

 

 


$Date: 2021-04-26 16:47:12 +0200 (lun. 26 avril 2021) $