:: Enseignements :: ESIPE :: EISC3 :: 2013-2014 :: Programmation Java réseau ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Chat Java |
Cet exercice est l'occasion d'un brin de causette en UDP. Dans un premier temps, nous réalisons un serveur UDP affichant les chaînes de caractères extraites de ses paquets. Dans un second temps, il s'agit de créer un client UDP envoyant des chaînes de caractères. Enfin nous terminons en combinant ces deux fonctionnalités pour réaliser une application de chat en UDP.
Réception de chaînes de caractères
Écrire une classe utilisant une socket UDP pour recevoir des chaînes de caractères qui lui sont envoyées. On indiquera pour chacune de ces chaînes reçue le moment de réception ainsi que la socket expéditrice (@IP et port). On spécifiera en tant qu'argument l'encodage que l'on utilisera pour décoder les chaînes.
Voici un exemple d'exécution de cette classe :
java UDPReceiver 0.0.0.0 2013 UTF-8 # On s'attache sur toutes les interfaces sur le port 2013, on utilise l'encodage UTF-8
$ 11:01 10.1.37.4:2040 said: hello world!
$ 11:03 10.1.37.10:11033 said: do you like Java?
$ 11:04 10.1.37.30:20001 said: nothing to say...
On pourra tester pour l'instant le récepteur de chaînes en utilisant `netcat` en mode client UDP afin d'émettre des paquets UDP : `netcat -l -u ip port`
Multichat
Adapter la classe précédente afin de pouvoir également recevoir des messages envoyés sur un groupe de multicast (dont on précisera l'adresse en argument).
On pourra utiliser une adresse de multicast IPv4 sur la plage 239.252.0.0-239.255.255.255.
Envoi de chaînes de caractères
Il s'agit maintenant d'envoyer des datagrammes UDP contenant des chaînes de caractères. Écrire une application récupérant des lignes de textes communiquées sur l'entrée standard (System.in), par exemple en utilisant un Scanner. On envoie chacune de ces chaînes vers une socket destinataire en utilisant l'encodage que l'on aura indiqué comme argument.
Voici un exemple d'exécution :
java UDPSender 10.1.37.2 2013 UTF-8
$ hello world!
Réception et émission : 2 pour le prix d'1
On réunit la réception et l'émission de paquets en utilisant une unique `DatagramSocket` afin d'alternativement recevoir et émettre un paquet. Cela nous permet donc une discussion unicast entre deux sockets.
Que se passe-t-il si l'on tarde à écrire une ligne sur l'entrée standard alors qu'on tente d'en lire ? Ou alors si aucun message ne provient sur la socket UDP sur laquelle un appel à `receive()` est en cours ? Proposer une solution imparfaite pour résoudre ce problème.
Quelques remarques pour finir
Nous sommes confrontés à deux problèmes pour cet exercice :
- L'usage d'une unique thread avec une communication bi-directionnelle par le biais d'une socket bloquante. Il faudrait donc utiliser deux threads, une pour recevoir les messages et une autre pour en envoyer.
- L'utilisation du terminal où se mélangent messages reçus et ligne en cours d'édition pour l'envoi. Il faudrait soit utiliser une blibliothèque d'affichage en terminal (du type [ncurses http://sourceforge.net/projects/javacurses/]), soit employer une interface graphique (avec la bibliothèque Swing par exemple) avec deux zones pour l'affichage des messages envoyés et reçus.
© Université de Marne-la-Vallée