:: Enseignements :: Master :: Master TTT :: 2008-2009 :: Programmation Réseaux en Java ::
[LOGO]

Examen -- Master 2 TTT -- Programmation des réseaux avec Java -- Option


23 Mars 2009

Remarques importantes :

  • Examen sur machine, durée : 3h.
  • Seuls les sites web java.sun.com et word reference sont autorisés.
  • La documentation est aussi disponnible en local ICI
  • Seule l'utilisation du logiciel eclipse est autorisée.
  • Vous avez également le droit de consulter les fichiers de votre répertoire personnel.
  • Vous créerez un nouveau projet examReseaux et dans ce projet un paquetage fr.umlv.ttt.exam qui contiendra toutes vos classes.
  • Vous ferez une archive du repertoire src que vous enverrez à l'adresse masson@univ-mlv.fr avant de quitter la salle. Les commandes :
    cd ~/workspace/examReseaux
    tar czf EXAMTTT_PRENOM_NOM.tgz src
    permettent de créer l'archive demandée.
  • Parmis les critères de notations entreront en jeux : la clarté du code ; le respect des conventions de nommage ; la pertinance du choix des noms de méthodes, champs et paramètres...

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 :
    1. quel est le principe d'un sélecteur et comment doit-on enregistrer un channel en accept, connection, read ou write ?
    2. enregistrer le ServerSocketChannel pour être prévenu lors d'un accept, et faire un affichage indiquant le client qui se connecte.
    3. 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.
    4. 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).