Client UDP, encodage des caractères et représentation des données

Client UDP Echo

Dans cet exercice, on souhaite écrire un client UDP NetcatUDP permettant d'interroger (ici, envoyer des chaînes de caractères à) 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.uge.net.udp.NetcatUDP gaspard.univ-mlv.fr 7 UTF-8

Le client doit se comporter en boucle de la manière suivante :

Implémentez ce client dans le main de la classe NetcatUDP.java. On supposera (dans cet exercice) qu'aucun paquet ne fait plus de 1024 octets et on utilisera un seul buffer de cette taille pour la réception.

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.

Vous pouvez tester votre client en démarrant un serveur Echo en local : 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.uge.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.uge.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.uge.net.udp.NetcatUDP localhost 4545 UTF-8
Que se passe-t-il avec la chaîne "Ah l'€!"?

Meilleur serveur de mise en majuscules

Pour pallier le problème du choix de l'encodage, le nouveau serveur ServerBetterUpperCaseUDP.jar attend des paquets qui décrivent quel est l'encodage utilisé pour la chaîne de caractères qu'ils contiennent.

Protocole BetterUpperCase

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.
Les paquets ne peuvent pas faire plus de 1024 octets.

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.java. Il vous faudra compléter les fonctions decodeMessage et encodeMessage en respectant les conventions données dans la documentation des méthodes.

Testez vos deux fonctions avec les tests JUnit 5 de la classe ClientBetterUpperCaseUDPTest.

Après avoir démarré le serveur par

$ java -jar ServerBetterUpperCaseUDP.jar 7778
on attend un comportement du type :
$ java fr.uge.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!