CSC 4509 – Algorithmique et communications des applications réparties

Portail informatique

Communication connectée: échange d'objets sérialisés

  • Communication entre processus: échange d'objets sérialisés avec le mode connecté de JAVA NIO"

Le TP précédent a mis en valeur qu'il n'y a plus de notion de paquet dans le mode connecté de JAVA NIO (service de TCP), et qu'il n'y donc plus d'information délimitant deux messages qui se suivent. Il existe diverses solutions pour résoudre ce problème:

  • N'échanger que des paquets de tailles fixes.
  • Convenir d'un délémimitateur. Par exemple, le caratère "passage à la ligne" pour les protocoles textuels en clair comme SMTP, HTTP, FTP.
  • Faire précéder tous les paquets d'une entête (de taille fixe) qui indique la taille (variable) du paquet qui suit.
  • ...

Echange d'objets sérialisés à travers une communication en mode connecté

La troisième solution permet d'échanger tous types de paquets. Pour s'échanger des objets sérialisés (donc une donnée non textuelle de taille variable), c'est la plus adaptée. C'est celle que nous allons mettre en place pour ce TP. Chaque paquet échangé sera précédé d'une entête qui contiendra deux entiers:

  • Le premier indiquera la taille du paquet qui suit.
  • Le second indiquera le type contenu dans ce paquet (pour ce TP, le fichier csc4509.MessType a prévu deux types possibles: String, ou Personne, mais il suffit d'enrichir ce fichier pour que le client et le serveur puissent se mettre d'accord pour l'échange d'autres types).

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

Vous y trouverez le client et serveur déjà écrits. Ils utilisent la classe FullDuplexMsgWorker pour faire leurs échanges. Il reste 6 méthodes à écrire dans cette classe

La plus longue est celle de lecture readMessage car il faut analyser les octets qui arrivent pour savoir où en est la lecture du paquet entrant. Pour cela l'archive fournit une énumération csc4509.ReadMessageStatus qui listent tous les états possibles de cette lecture

  • ReadUnstarted : la lecture du paquet n'a pas commencé.
  • ReadHeaderStarted: la lecture de l'entête est en cours, mais pas encore finie.
  • ReadHeaderCompleted: la lecture de l'entête est terminée, mais on n'a pas encore commencé la lecture du paquet de données qui suit.
  • ReadDataStarted: la lecture des données est cours, mais pas encore finie.
  • ReadDataCompleted: la lecture s'est terminée normalement. Toutes les données sont lues, et prêtes à être délivrées par la méthode getData.
  • ChannelClosed: la lecture s'est terminée anormalement. La connexion a été fermée avant que la lecture ne soit terminée.

Completez les 6 méthodes de la classe FullDuplexMsgWorker et testez l'échange en lançant le serveur puis le client.

 

 

 


$Date: 2017-04-07 07:09:10 +0200 (ven. 07 avril 2017) $