:: Enseignements :: ESIPE :: E4INFO :: 2007-2008 :: Java Réseau II - Applications réseaux ::
[LOGO]

TCP non bloquant et serveur HTTP simple


TD sur 2 séances.

Exercice 1 - Un serveur Echo en non-bloquant

Écrire un client serveur Echo qui accepte de multiples clients en non-bloquant. Vous utiliserez pour cela un sélecteur (java.nio.channels.Selector).
Pour simplifier le développement, le serveur ne possèdera qu'une unique thread.

  1. Rappeler le principe d'un sélecteur et comment on doit 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 d'objet attaché de la clé de sélection.
  4. Faire en sorte de gérer le accept/connection de façon non-bloquante.

Exercice 2 - Additionneur TCP non bloquant

On souhaite écrire un serveur qui accepte de multiples clients en non-bloquant et permettant d'effectuer l'addition, pour chaque client, des nombres fournis par ce dernier.

Afin de "simplifier", on considère qu'une fois le client connecté au serveur, il fait parvenir un premier entier correspondant au nombre d'entiers à sommer. Puis il fait parvenir les-dits entiers.

On souhaite transmettre les entiers sous leur forme binaire. Pour se faire, regarder du côté de putInt et getInt

Exercice 3 - Écrire un proxy TCP en non-bloquant

Ré-écrire le proxy TCP en utilisant les sélecteurs. Il faudra penser à s'enregistrer en connect lors de l'établissement de la connection avec le serveur.

Exercice 4 - Un simple serveur de fichier HTTP

Écrire un petit programme Java qui permet d'émuler un serveur HTTP très simple en ré-utilisant le serveur TCP avec un pool de threads.
Voici les fonctionnalités qui doivent être implantées par ce petit serveur:
  • répondre aux requêtes GET des clients sur des noms de fichiers réguliers (pas les répertoires);
  • attribuer le type MIME application/octet-stream aux ressources retournées. On pourra également faire des essais, plus visuels, avec les types text/plain ou text/html. Ensuite, on pourra tenter de déterminer le Content-Type à partir de l'extension du fichier à renvoyer;
  • pour simplifier la gestion de la connexion avec le client, on pourra fermer la connexion après l'envoi de la ressource. En revanche, il est nécessaire de lire l'intégralité de la requête du client avant de fermer la connexion.

Exercice 5 - Les messages d'erreur

Ajouter au serveur précédent la fonctionnalité suivante: lorsqu'une ressource recherchée par un client n'est pas un fichier régulier, et que le serveur n'est pas en mesure de la retourner, renvoyer un message d'erreur 404 Not Found accompagné d'une page HTML expliquant poliment que la ressource n'est pas accessible.

Exercice 6 - Formulaire POST

Utiliser le formulaire ci-dessous pour regarder ce qu'envoit un browser lors d'un POST sur un formulaire.

    <html>
	  <body>
	    <h1>Enquête de satisfaction</h1>

	    <h4>Merci de remplir le questionnaire suivant:</h4>
	    <form
	      enctype="application/x-www-form-urlencoded"
	      action="/enquete"
	      method="POST">
	      Votre nom : <input type="text" name="lastname" value="" size="20"><br>
	      Votre prénom : <input type="text" name="firstname" value="" size="20"><br>
	      Concernant la matière :
	      <select name="thema">
		<option value="Électronique">Électronique
		<option value="Java">Java
		<option value="Java Réseau">Java Réseau
		<option value="Java Avancé">Java Avancé
		<option selected value="Java Réseau Avancé">Java Réseau Avancé
	      </select>, vous vous estimez :<br>

	      Mécontent <input type="radio" name="satisfied" value="10"><br>
	      Assez content <input type="radio" name="satisfied" value="20"><br>
	      Content <input type="radio" name="satisfied" value="30"><br>
	      Très content <input checked type="radio" name="satisfied" value="40"><br>

	      <Input type="submit" value="Envoyer">
	      <input type="reset" value="Réinitialiser">
	    </form>

	  </body>
     </html>