:: Enseignements :: Master :: Master TTT :: 2012-2013 :: Programmation réseau en Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Sockets UDP en Java |
Ce TD est l'occasion de manipuler des sockets UDP en utilisant l'API java.net pour envoyer et recevoir des datagrammes.
Exercice 1 - Jouons avec Netcat
Nous manipulons un peu Netcat pour créer des sockets UDP et communiquer entre-elles.
- Envoyer un paquet UDP sur le serveur echo gaspard (port 7). Ce serveur a pour mission de renvoyer le paquet tel qu'il l'a reçu.
- Nous envoyons un paquet UDP depuis le réseau universitaire vers un serveur echo en dehors du réseau local. Le 1er routeur traversé joue le rôle de NAT (Network Address Translator). Expliquer comment le paquet retour peut parvenir à notre machine sur le réseau local (sans @IP publique).
- Nous souhaitons maintenant jouer le rôle de serveur : nous pouvons lancer netcat en mode serveur avec l'option -l (listen). Tester différentes configurations :
- Rattachement à l'adresse localhost 127.0.0.1 puis à l'adresse joker : tester dans les deux cas si l'on parvient à recevoir les paquets d'un client d'une machine distante.
- Rattachement à différents ports : parvient-on par exemple à écouter sur le port echo standard (7) ?
Exercice 2 - Ping
On souhaite réaliser un client UDP en Java. Ce client ouvre une socket pour expédier des paquets UDP et réceptionne en retour un écho des paquets transmis par le serveur. Il peut ainsi en déduire la durée d'un aller-retour d'un paquet sur le réseau.
- Implanter une classe envoyant un paquet contenant un entier exprimé sous forme décimale en ASCII vers une socket serveur définie par son adresse IP et son port. On pourra convertir l'entier en tableau d'octets transmissible avec ("" + i).getBytes("ASCII").
- Rajouter des modifications afin d'attendre une réponse du serveur contacté suite à l'envoi du paquet. Lorsqu'une réponse parvient, il est nécessaire de vérifier que le paquet provient du bon serveur et que son contenu est bien l'entier envoyé. Pour récupérer l'entier, il faut convertir le tableau d'octets en String en utilisant le jeu de caractères ASCII, puis convertir la chaîne en entier. On en profitera pour mesurer le temps d'un aller-retour (réaliser des différences de temps avec des appels à System.nanoTime()).
- Réfléchir au concept de pseudo-connexion et essayer de l'appliquer à la situation présente pour empêcher une machine non impliquée dans le dialogue d'envoyer un paquet au client.
- Nous pouvons ne pas recevoir de réponse du serveur (paquet requête perdu sur le chemin, serveur éteint, firewall filtrant, serveur ne souhaitant pas répondre, paquet réponse perdu...). Dans cette situation, notre client se retrouve bloqué sur la méthode de réception de paquet. Introduire un délai limite après lequel la méthode de réception retourne une exception.
- Réaliser une séquence de pings afin d'obtenir une latence moyenne pour l'aller-retour d'un paquet.
Exercice 3 - Pong
Nous venons de réaliser un client UDP mesurant le délai entre l'envoi d'un paquet et son retour par le serveur. Nous avons utilisé des serveurs externes pour les tests. Nous souhaitons maintenant implanter nous-même un serveur UDP réalisant un renvoi du paquet reçu à l'identique (serveur de type echo).
- Implanter un serveur créant une socket UDP en écoute et mettant en oeuvre une boucle de réception de paquets. On affichera pour l'instant le contenu des paquets reçus sur la sortie standard.
- Pour chaque paquet reçu, renvoyer un paquet de même contenu à l'expéditeur.
Exercice 4 - Multichat
On souhaite mettre en place un salon de discussion à l'aide d'un groupe de multicast. Dans un premier temps pour écouter les messages, nous implantons une classe afin de recevoir des paquets envoyés sur une adresse de multicast ; dans un second temps pour émettre des messages, il nous faut mettre en place un émetteur de paquets UDP.
- Créer une classe MultichatReceiver permettant d'afficher tous les paquets envoyés à destination d'un groupe de multicast (on suppose que les chaînes envoyées sont encodées en UTF-8). À cet effet il faudra préalablement créer une socket UDP écoutant sur un port donné et s'abonner à un groupe de multicast représenté par une adresse IP passée en argument.
- Pour ne pas entendre de cris en provenance du CRI, il est demandé d'utiliser une adresse de multicast dans la plage 239.252.0.0-239.255.255.255. Comment écrire cette plage en utilisant une notation masque ou une notation longueur de préfixe ?
- Tester le MultichatReceiver en envoyant des paquets UDP vers l'adresse de multicast à l'aide de netcat.
- Créer un client UDP en Java permettant d'envoyer des paquets dont le contenu est fourni ligne par ligne sur l'entrée standard (on pourra utiliser un Scanner). On pourra également configurer le client afin de choisir le jeu de caractères utilisé pour convertir les chaînes en tableau d'octets à transmettre sur le réseau. Tester le client en envoyant sur l'adresse de multicast des paquets avec plusieurs jeux de caractères différents. Constater l'effet sur le récepteur.
© Université de Marne-la-Vallée