:: Enseignements :: Master :: M1 :: 2015-2016 :: Programmation d'applications réseaux ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | 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.
© Université de Marne-la-Vallée