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 :
Scanner
);
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 7777qui 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-8Le 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'€
$ java -jar ServerUpperCaseUDP.jar 4545 Latin1 $ java fr.uge.net.udp.NetcatUDP localhost 4545 UTF-8Que se passe-t-il avec la chaîne
"Ah l'€!"
?
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.
int
en BigEndian correspondant à la longueur du nom de l'encodage écrit en ASCII ;
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 6fqui 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 7778on 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!