:: Enseignements :: Master :: M1 :: 2015-2016 :: Programmation d'applications réseaux ::
[LOGO]

Client UDP simple tolérant aux pertes


Exercice 1 - Vous pouvez répéter la question?

En utilisant le serveur de mise en majuscule ServerUpperCaseUDP.jar et votre client ClientUpperCaseUDP développé lors de la séance précédente, nous allons introduire artificiellement de l'instabilité entre le client et le serveur en introduisant un proxy ou relai: le client interroge le proxy, qui relaie les demandes au serveur, et les réponses du serveur au proxy sont relayées au client.

En UDP, les paquets peuvent être perdus ou retardés, mais ce comportement se produit rarement sur un réseau local. Le programme UDPProxy.jar va nous permettre de le simuler sur votre machine. ProxyUDP est un proxy UDP qui va perdre un certain pourcentage des paquets et qui peut échanger aléatoirement l'ordre des paquets.

Dans trois consoles (shell) différentes, simultanément visibles à l'écran, exécutez les trois applications suivantes:
$ java -jar ServerUpperCaseUDP.jar 4545 UTF-8  
$ java -jar UDPProxy.jar 7777 localhost 4545 -no-swap 
$ java fr.upem.net.udp.ClientUpperCaseUDP localhost 7777 utf-8
et testez votre client en lui demandant d'envoyer des chaines successives. Que se passe-t-il lorsque le proxy décide de jeter un paquet? Quel est l'impact sur votre client par la suite?

Recopiez votre client dans une classe ClientUpperCaseUDPFaultTolerant et modifiez la dans un premier temps de manière à afficher
Le serveur n'a pas répondu
si le serveur n'a pas répondu en moins d'une seconde.

Le problème est que la méthode receive de DatagramChannel est bloquante et qu'il n'est pas possible de lui fournir un timeout.
Une solution consiste à lancer un thread listener qui fera la lecture sur la DatagramChannel et qui communiquera les chaînes en majuscules recues à la thread principale au moyen d'une BlockingQueue.
Après avoir démarré votre Thread d'écoute, vous pourrez accéder aux réponses du serveur en utilisant la méthode poll de BlockingQueue qui prend en paramètre un delai de timeout.

Améliorez un peu votre client pour qu'en cas de timeout, il renvoie le paquet correspondant en espérant que celui-là ne soit pas perdu, et ainsi de suite...

Faites la même chose pour le protocole de l'exercice 3 du td02; écrivez la classe ClientBetterUpperCaseUDPFaultTolerant et testez-la avec le serveur ServerBetterUpperCase.jar et le proxy UDPProxy.jar.

Exercice 2 - Des milliers de lignes à mettre en majuscule?

Écrire un programme qui lit un fichier texte (ligne par ligne), les stocke dans une liste, puis décide des les envoyer toutes à la suite les unes des autres à mettre en majuscule au serveur. Lorsqu'il reçoit les réponses, il les stocke dans une autre liste, et lorsqu'il a tout reçu, il affiche le contenu de cette dernière liste.

Testez votre programme à travers le Proxy UDP. Constatez vous des problèmes. Essayez de comprendre d'où cela vient, et imaginez une solution paliative.