:: Enseignements :: Master :: M1 :: 2011-2012 :: Programmation d'Applications Réseaux ::
[LOGO]

TCP non bloquant


Exercice 1 - Mini additionneur TCP non bloquant

On souhaite écrire un serveur qui accepte de multiples clients en non-bloquant et permettant d'effectuer l'addition de deux entiers pour chaque client.

Pour simplifier, on vous donne le code du client, qui demande 2 entiers au clavier, les envoie en serveur et attends la réponse du serveur.

Ecrire le code du serveur non bloquant.

Exercice 2 - Un serveur Echo bizarre en non-bloquant

Écrire un serveur qui accepte de multiples clients en non-bloquant. Il se comportera comme un serveur Echo classique, mais il doublera toutes les lettres A. Vous utiliserez pour cela un sélecteur (java.nio.channels.Selector). Attention aux tailles des buffers...
Pour simplifier le développement, le serveur ne possèdera qu'une unique thread, et on considerera les bytes comme des caractères (ascii).

  1. Rappeler le principe d'un sélecteur et comment on doit enregistrer un channel en accept, connection, read ou write.
  2. Enregistrer le ServerSocketChannel pour être prévenu lors d'un accept, et faire un affichage indiquant le client qui se connecte.
  3. Lors d'un accept, dans un premier temps, enregistrer directement le SocketChannel en read.
    Lorsque que le SocketChannel est ok pour le read, on enregistre celui-ci pour le write en passant la réponse en tant d'objet attaché de la clé de sélection.
  4. Faire en sorte de gérer le accept/connection de façon non-bloquante.
N'oubliez pas de tester avec plusieurs clients en parrallèle, avec des buffers de petites tailles, etc.

Exercice 3 - Écrire un proxy TCP en non-bloquant

Ré-écrire le proxy TCP en utilisant les sélecteurs. Il faudra penser à s'enregistrer en connect lors de l'établissement de la connection avec le serveur.

Pour vous faciliter la tâche, nous vous offrons un petit bout de ce proxy. Dans l'implémentation choisie, ClientEventHandler simule un thread comme dans la version bloquant. Attention cependant, les clefs du selecteur sont affectées aux SocketChannels...