:: Enseignements :: Master :: Master TTT :: 2008-2009 :: Programmation Réseaux en Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Examen -- Master 2 TTT -- Programmation des réseaux avec Java -- Option |
23 Mars 2009
Remarques importantes :
Nous avons vu durant les Tds les classes et méthodes historiques pour programmer
des communications UDP et TCP.
Avec la version 5 de Java ont été entroduites de nouvelles classes, regroupées dans le paquetage
java.nio, qui simplifient la manipulation des entrées/sorties en Java.
Le but de ce TP est de comprendre ces classes à partir de la lecture de leur documentation.
Les trois premières sections ont pour but de vous aider à lire la documentation. La dernière section
décrie le travail demandé.
La classe ByteBuffer
La classe java.nio.ByteBuffer permet de modéliser un buffer d'octet,
sans utiliser directement
un tableau d'octets (byte[]).
Elle hérite de la classe java.nio.Buffer.
Lisez la documentation de ces deux classes en vous demandant notamment :
- quelle est la différence entre la méthode allocate() et la méthode
allocateDirect() ?
- à quoi correspondent les champs capacity, limit et position ?
- que font les méthodes clear(), flip(), et rewind() ?
Les canaux
Un canal est une connexion ouverte sur une entité comme un fichier,
une socket ou un programme permettant d'effectuer des opérations d'entré/sortie.
Un canal est modélisé par la classe java.nio.channels.Channel.
Lisez la documentation des classes
java.nio.channels.Channel et
java.nio.channels.SocketChannel en vous demandant notamment :
- Comment obtient-on un objet SocketChannel ouvert sur une socket distante s ?
- Comment utilise-t-on un objet SocketChannel pour lire et écrire vers une socket distante ?
Les selecteurs (Bonus)
La classe
java.nio.channels.Selector représente un multiplexeur d'objets
SelectableChannels (notamment
SocketChannel hérite de
SelectableChannel)
Lisez la documentation de cette classe et demandez vous à quoi elle sert.
Ce qu'il faut coder !
Munis de ces informations, vous devez maintenant écrire deux versions d'un client
echo TCP et
en bonus un
serveur echo
non bloquant.
- le premier client, fr.umlv.ttt.exam.SimpleEchoClient, utilise les classes vues en cours du
paquetage java.net,
- le second client, fr.umlv.ttt.exam.NIOEchoClient, utilise
les classes des paquetages java.nio et java.nio.channel,
- le serveur, fr.umlv.ttt.exam.NonBloquingEchoServer,
est une version non bloquante du serveur utilisant
les sélecteurs.
Vous pouvez suivre la procédure suivante :
-
quel est le principe d'un sélecteur et comment
doit-on enregistrer un channel en accept, connection, read
ou write ?
-
enregistrer le ServerSocketChannel
pour être prévenu lors d'un accept,
et faire un affichage indiquant le client qui se connecte.
-
lors d'un accept, dans un premier temps,
enregistrer directement le SocketChannel
en read.
lorsque que le SocketChannel est ok pour le read,
on enregistre celui-ci pour le write en passant la réponse en tant
qu'objet attaché de la clé de sélection.
-
faites enfin en sorte de gérer le accept/connection de
façon non-bloquante.
Vous pouvez écrire un serveur echo pour tester vos clients, ou utiliser celui de la machine gaspard sur le port 7.
Vous pouvez tester le serveur non bloquant avec n'importe lequel de vos clients, on l'utilitaire netcat (man netcat).
© Université de Marne-la-Vallée