:: Enseignements :: Master :: M1 :: 2017-2018 :: Programmation d'applications réseaux ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Client UDP, encodage des caractères et représentation des données |
Exercice 1 - Mon premier client UDP
Dans cet exercice, on souhaite écrire un client UDP
NetcatUDP permettant d'interroger un serveur dont l'adresse et le numéro de port
sont pris en paramètre sur la ligne de commande. Le dernier paramètre est le nom d'un jeu de caractères.
Par exemple, on appellera ce client avec la ligne:
$ java fr.upem.net.udp.NetcatUDP gaspard.univ-mlv.fr 7 UTF-8
Le client doit se comporter en boucle de la manière suivante:
- Il lit une chaîne de caractères au clavier;
- Il envoie au serveur (dont l'adresse et le port sont donnés
en paramètre) un paquet qui contient les octets représentant cette
chaîne dans le jeu de caractères donné en dernier paramètre;
- Il attend ensuite de recevoir un paquet et affiche
- l'adresse de l'expéditeur du paquet reçu,
- le nombre d'octets recus et
- la chaîne représentée par les octets du paquet
dans le jeu de caractères donné en dernier paramètre.
Vous pouvez implémenter votre client dans le main de la classe fr.upem.net.udp.NetcatUDP.
Pour tester votre client, vous pouvez utiliser un serveur implémentant le protocole
Echo (RFC 862) qui
est par défaut accessible sur le port 7 d'une machine.
Le protocole est très simple : le serveur renvoie tout paquet reçu à l'identique à l'expéditeur.
Si vous êtes sur les machines fixes des salles de TP de l'université,
vous pouvez utilisez la machine
gaspard.univ-mlv.fr.
Vous devriez obtenir le comportement suivant:
$ java fr.upem.net.udp.NetcatUDP gaspard.univ-mlv.fr 7 UTF-8
C'est beau l'€
Received 16 bytes from /193.55.61.20:7
String: C'est beau l'€
Comme les paquets sont retournés à l'identique, il est normal que la chaîne affichée
soit la même que la chaîne saisie.
Si vous n'avez pas accès à la machine
gaspard, vous pouvez tester votre client en démarrant un serveur Echo en local.
Pour ce faire récupérez le serveur
ServerEchoUDP.jar
et lancez le sur votre machine avec la commande:
$ java -jar ServerEchoUDP.jar 7777
qui lance le serveur en écoute sur le port 7777 de votre machine.
Vous devriez obtenir le comportement suivant:
$ java fr.upem.net.udp.NetcatUDP localhost 7777 UTF-8
C'est beau l'€
Received 16 bytes from /127.0.0.1:7777
String: C'est beau l'€
Tester maintenant votre client avec notre serveur
de mise en majuscule de chaînes de caractères. Récupérez le serveur
ServerUpperCaseUDP.jar
et lancez le sur le port 4545:
$ java -jar ServerUpperCaseUDP.jar 4545 UTF-8
Le serveur décode les paquets reçus comme des chaînes encodées dans son encodage de
démarrage (
UTF-8 dans l'exemple ci-dessus) et renvoie la chaîne mise en
majuscule correspondante encodée dans ce même encodage.
Vous devriez obtenir le comportement suivant:
$ java fr.upem.net.udp.NetcatUDP localhost 4545 UTF-8
Autant arrêter le Java si c'est pour ça!
Received 42 bytes from /127.0.0.1:4545
String: AUTANT ARRÊTER LE JAVA SI C'EST POUR ÇA!
ah l'€
Received 8 bytes from /127.0.0.1:4545
String: AH L'€
Lancer votre client et le serveur avec deux jeux de caractères différents. Par exemple,
$ java -jar ServerUpperCaseUDP.jar 4545 Latin1
$ java fr.upem.net.udp.NetcatUDP 4545 UTF-8
Que se passe-t-il avec la chaîne
"Ah l'€!"?
Exercice 2 - Meilleur serveur de mise en masjucules
Pour palier au problème du choix de l'encodage, le nouveau serveur
ServerBetterUpperCaseUDP.jar
attend des paquets qui décrivent avec quel encodage la chaîne de caractères qu'ils
contiennent a été encodée.
Les paquets ont le format suivant:
- Un int en BigEndian correspondant à la longueur du nom de l'encodage écrit en ASCII;
-
Le nom de l'encodage en ASCII;
-
Les octets de la chaîne encodée avec cet encodage.
Le serveur renvoie sa réponse en utilisant le même format de paquet. Attention: l'encodage
utilisé pour la réponse n'est pas nécessairement le même que celui de la requête.
Par exemple, la chaîne
"élo" dans l'encodage
Latin1 correspondra au paquet:
00 00 00 06 4c 61 74 69 6e 31 e9 6c 6f
qui se décompose comme suit:
00 00 00 06 --> int valant 6 (en BigEndian) = longueur en octets de "Latin1" encodé en ASCII
4c 61 74 69 6e 31 --> "Latin1" encodé en ASCII
e9 6c 6f --> "élo" encodé en Latin1
En partant de la trame suivante, écrivez un client
ClientBetterUpperCaseUDP.
Il vous faudra compléter les fonctions
decodeMessage et
encodeMessage
en
respectant les conventions données dans la documentation des fonctions.
Testez vos deux fonctions avec les tests JUnit 4
de la classe
ClientBetterUpperCaseUDPTest. Vous devrez mettre la classe
encodeMessage en
public pour que la classe de test puisse y accéder.
Attention il faut bien vérifier qu'Eclipse ouvre
le fichier source
ClientBetterUpperCaseUDPTest.java en
UTF-8. S'il est bien ouvert en
UTF-8, vous devriez voir
dans le test
encodeMessageBasic2() la chaîne
"a€". Si ce n'est pas le cas, il faut changer l'encodage dans les paramètres
de votre workspace.
Après avoir démarré le serveur par
$ java -jar ServerBetterUpperCaseUDP.jar 7778
on attend un comportement du type:
$ java fr.upem.net.udp.ClientBetterUpperCaseUDP localhost 7778 Latin1
au boulot!
AU BOULOT!
c'est à finir pour la prochaine séance!
C'EST À FINIR POUR LA PROCHAINE SÉANCE!
© Université de Marne-la-Vallée