:: Enseignements :: ESIPE :: E4INFO :: 2012-2013 :: Applications réseaux ::
[LOGO]

Encoder et decoder en NIO


Exercice 1 - Bizarre vous avez dit bizarre

Récuperer les fichiers ClientBizarre.java et ServerBizarre.java. Au total, le client envoie les octets:
97 98 99 226 130 172 100 101 102 226 130 
qui en UTF-8 s'interprètent comme suit:
97 -> a
98 -> b
99 -> c
226 130 172 -> €
100 -> d
101 -> e
102 -> f
226 130 -> mal formed

  1. Lancer le serveur, puis le client et expliquer le comportement observé.
  2. Corriger le code de ServerBizarre en utilisant la méthode decode à 3 paramètres. Si votre processus de décodage est correct, vous devez afficher:
    abc€def*
    

Exercice 2 - Compter les lignes

On veut réaliser un serveur CountServer qui prend un flux d'entrée qu'il interprète comme une suite de caractères UTF-8 et qui renvoie une suite d'int en BigEndian correspondant au nombre de caractères lus dans chaque ligne. Les caractères mal encodés du flux d'entrée sont ignorés.

Par exemple, si le client envoie les octets codant:
abcd
a€e
le serveur renverra à ce client les int 4 et 3 en BigEndian.

Pour tester votre serveur, vous pouvez récupérer le client CountClient.jar et le fichier test1.txt et test2.txt. On le lance
$java -jar CountClient.jar test1.txt  localhost 7777
java fr/upem/tcp/CountClient test1.txt localhost 7777
8
4
8
6
$java -jar CountClient.jar test2.txt  localhost 7777
4
2
3
6
test1.txt est le nom du fichier à envoyer et localhost 7777 est l'adresse du serveur.

Vous pouvez partir du squelette de serveur TemplateServer.java

Exercice 3 - Serveur de décodage

On veut réaliser un serveur ReencodeServer qui prend un flux d'entrée qu'il interprète comme une suite de caractères UTF-8 et renvoie ce flux encodé dans un Charset destinationCharset spécifié par le client. Les caractères qui ne peuvent pas être encodés dans le flux de sortie sont ignorés. Le protocole est le suivant:
  1. Le client envoie le nom du destinationCharset comme suit: il envoie un int en BigEndian correspondant au nombre n d'octets pour écrire destinationCharset en ASCII suivi des n octets correspondant.
  2. Le serveur renvoie l'octet 0 si destinationCharset est disponible sur le serveur et l'octet 1 sinon (dans ce cas le serveur ferme la connexion).
  3. Le client écrit le flux des octets à réencoder puis il ferme la connection en sortie.
  4. Le serveur renvoie le flux d'octets correspondant au flux d'entrée réencodé dans le Charset destinationCharset.

  1. Réaliser un serveur ReencodeServer qui prend en argument le port d'écoute. Pour tester votre serveur, vous pouvez récupérer le client ReencodeClient.jar et le fichier test.txt. On le lance par
    $java -jar ReencodeClient.jar test.txt ASCII localhost 7777
    zaeazeazeazeazeazeazezaaze
    $java -jar ReencodeClient.jar test.txt latin1 localhost 7777
    zaeazeazeazeazeazeazezaazeææÂêæÂêæÂæêæêÂæÂæêÂ
    
    test.txt est le nom du fichier à envoyer, ASCII est le nom du destinationCharset et localhost 7777 est l'adresse du serveur.
  2. Modifier votre serveur pour qu'il rajoute à la fin du flux réencodé, la phrase X characters could not be converted.