:: Enseignements :: Master :: M1 :: 2013-2014 :: Programmation d'applications réseaux ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
Client/serveur UDP, représentation des données numériques
|
Exercice 1 - Longue Somme de Long (un client)
On souhaite mettre en place une sorte de calculette permettant à un client
de demander à un serveur le résultat de la somme de plusieurs nombres qui
sont des entiers long (sur 64 bits).
Le "protocole" convenu établit que pour cela, le client doit envoyer chaque
opérande, un par un, en binaire représenté dans la convention "network order"
(i.e. big endian -- l'octet de poids fort est enregistré à l'adresse mémoire
la plus petite). Le résultat de la somme totale sera renvoyé par le serveur
à la fin de la réception des opérandes, qui est signalée par la première opérande nulle
(i.e. 0) reçue du client.
-
Implémenter les méthodes de conversions
longToByteArray et byteArrayToLong
permettant les conversions entre long et tableau de
byte en Big Endian. Tester ces méthodes en les appelant
l'une après l'autre et en vérifant que vous récupérez bien l'entier orginal.
- Implémenter un client très simple qui lit au clavier des entiers
long (avec la méthode nextLong() de la classe Scanner)
et les envoit succesivement à votre serveur. Lorsque le
client lit l'entier nul au clavier, il l'envoie au serveur et se place
en attente de réception de la réponse de ce serveur (il affiche la somme reçue à l'écran).
- Implémenter un serveur qui rend ce service de
en supposant qu'un seul client l'utilise à la fois.
En particulier, on ne se souciera pas de la source des paquets.
-
Tentez alors d'utiliser plusieurs clients simultanément avec le même serveur.
Que constatez vous? Comment l'expliquer?
Exercice 2 - Longue Somme de Long (plusieurs clients)
- On souhaite maintenant rendre le serveur capable de traiter correctement
plusieurs clients simultaménement. Proposez une implémentation.
-
En UDP les paquets peuvent être perdus et l'ordre d'émission n'est pas
nécessairement celui de réception. Par exemple, si vous envoyez des paquets
contenant les valeurs 1,2,3,4 et 5. Le serveur pourra recevoir dans l'ordre
2,1,5. Les paquets contenant 3 et 4 ont été perdus.
Quels problèmes se posent pour notre protocole ?
-
Ce comportement se produit rarement sur un réseau local.
Le programme
UDPProxy.jar
va nous permettre de le simuler sur votre machine.
UDPProxy est un proxy UDP qui va perdre un certain
pourcentage des paquets et qui va échanger aléatoirement l'ordre des paquets.
Pour l'utiliser, lancez dans trois shell différents les trois applications suivantes:
$ java fr.upem.net.udp.LongSumServer 7777
$ java -jar UDPProxy.jar 5555 localhost 7777 -long
$ java fr.upem.net.udp.LongSumClient localhost 5555
Dans cet example, UDPProxy écoute sur le port 5555 et
renvoie les paquets vers localhost:7777.
Proposez un protocole (succession des échanges, mécanisme d'acquitement,
remise dans l'ordre, format des paquets) pour ce service qui résiste à
ces problèmes. Vous rédigerez ce protocole sous la forme d'une RFC succincte
et la déposerez au format PDF sur
https://elearning.univ-mlv.fr/.
Exercice 3 - Forum de discussion Multicast
Écrire une application qui envoie sur un port donné d'un groupe de multicast
correspondant à une adresse IP donnée, tout ce qui est écrit sur
l'entrée standard. L'application affichera sur la sortie standard
tout ce qui est reçu sur ce groupe de multicast à destination de ce
port (il vous faut donc 2 threads). On considérera que les messages
textuels sont transmis en UTF-8 et que leur représentation ne peut dépasser 512
octets.
En utilisant tous ce même numéro de port et la même adresse IP, vous
pouvez obtenir une version basique d'un forum de discussion.
Attention: dans le cadre de l'utilisation du multicast
dans les salles de TP de l'université,
il ne faut pas
utiliser n'importe quelle adresse de multicast (certaines sont
utilisées pour des annonces ou du routage).
Vous pouvez regarder pour plus de détail l'URL
http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xml#multicast-addresses-13.
Limitez vous à l'utilisation des adresses dans la plage
239.252.0.0 - 239.255.255.255. Par ailleurs, ne changez pas
le TTL qui doit être à 1 par défaut.
Par exemple, pour éviter des interférences entre les groupes,
choisissez 239.252.0.x:7777 où x est le numéro
de votre salle.
Lorsque plusieurs applications tournent sur la même machine,
comment savoir laquelle a envoyé un message? Mettez en œuvre
une solution qui réponde à cette question.
Que doit-on faire lorsque l'utilisateur de votre application
ferme le flot de saisie des entrées (en tapant Control-D
pour fermer System.in par exemple)? Mettez en œuvre
une solution qui réponde à cette question.
Comment faire pour que la réception d'un paquet qui encode la chaîne
de caractères
"BYE!" provoque la fermeture "propre" de la socket,
des threads et de l'application.
© Université de Marne-la-Vallée