TP Not� 2013 : serveur HTTP

Dans ce sujet, nous vous demandons de r�aliser deux versions d'un serveur HTTP en utilisant la biblioth�que Java NIO.

Commencez par cr�er un nouveau projet Java dans votre environnement Eclipse que vous appellez tpnote-VotreNom. Cr�ez aussi dans cette arborescence du projet un fichier readme.txt dans lequel vous mettez vos notes et les r�ponses aux questions.

Le bar�me est donn� � titre d'indication.

Les exercices sont assortis de questions de compr�hension auxquelles vous devez r�pondre par �crit dans le fichier readme.txt.

En fin de TP :

  1. si ce n'est d�j� fait, cr�ez un fichier readme.txt dans lequel vous mettez vos notes � destination des correcteurs ;
  2. exportez votre projet Eclipse sous la forme d'une archive :
  3. t�l�-chargez le fichier sur moodle afin de fournir le r�sultat de votre travail ;
  4. v�rifiez avec l'enseignant pr�sent dans la salle que le fichier t�l�charg� est correct.

1 Pr�sentation du sujet

Objectif : compl�tez des classes qui permettent de r�aliser un serveur HTTP simple.

Notre serveur HTTP est tr�s simple. Il est capable de d�coder une requ�te de type GET. Une requ�te de type GET est constitu�e d'un ligne contenant le mot GET suivi d'un chemin (URI) correspondant au nom du fichier. Pour faire simple, les noms de fichiers sont trait�s � partir du r�pertoire /mci/inf/chris/public_html/.

La premi�re version du protocole traite les requ�tes une par une et cl�t le canal de connexion apr�s chaque traitement. Elle correspond au protocole 1.0 de HTTP.

2. R�cup�ration de classes

Cr�ez un paquetage www dans votre project Eclipse.

R�cup�rez les classes suivantes et mettez-les dans le paquetage www :

R�cup�rez la classe Httpd10Base.java et mettez-la dans le paquetage par d�faut.

3. Modification du Worker Httpd10WorkerBase.java (5 pts)

Vous devez modifier le Worker en compl�tant les TODOs et r�pondre aux questions.

  1. � la ligne 62, vous devez envoyer le contenu du ByteBuffer writeBuf sur le channel rwChan ;
  2. Entre les lignes 110 et 127, vous devez modifier le code pour que le fichier ouvert soit envoy� sur le channel rwChan.
  3. Expliquez en quelques phrases l'encha�nement des op�rations que vous avez r�alis� en compl�tant la classe entre les lignes 110 et 127 initiales.

4. Modification du serveur Httpd10Base (5 pts)

Vous devez modifier le serveur en compl�tant les TODOs et r�pondre aux premi�res questions qui suivent.

  1. Initialisez le channel entre les lignes 34 et 37 ;
  2. R�alisez l'ouverture de la connexion, le traitement de la requ�te et la fermeture de la connexion entre les lignes 39 et 47 ;
  3. Expliquez la diff�rence entre un ServerSocketChannel et un SocketChannel ;
  4. Quelle op�ration peut-on faire sur un ServerSocketChannel que l'on ne peut pas faire sur un SocketChannel ?
  5. Quelles op�rations peut-on faire sur un SocketChannel que l'on ne peut pas faire sur un ServeurSocketChannel ?

5. Test du serveur

Vous pouvez tester votre serveur soit en utilisant votre navigateur habituel, soit en utilisant telnet comme dans l'exemple suivant :

telnet localhost 2020
GET /index.html HTTP/1.0

Vous devez obtenir une r�ponse contenant du code HTML, dont l'ent�te ressemble � ceci :

HTTP/1.0 200 OK
Content-Type: text/html
Content-length: 2741
Connection: close

Si vous essayez avec un fichier qui n'existe pas, par exemple test.htm, vous devez obtenir un r�sultat ressemblant � :

HTTP/1.0 404 File Not Found 

6. Autres questions sur le serveur Httpd10 r�alis� (3 pts)

Une fois que vous avez test� le serveur r�alis� � la section pr�c�dente, r�pondez aux questions suivantes :

  1. Ce serveur peut-il �tre utilis� par plusieurs clients ?
  2. Expliquez la s�quence de traitements r�alis�s par le serveur pour r�pondre � une requ�te d'un client ;
  3. En mettant le serveur en mode debug, combien d'ouvertures de connexions sont r�alis�es pour charger la page index.html du r�pertoire /mci/inf/chris/public_html ?

7. Maintien des connexions ouvertes (5 pts)

Le serveur pr�c�dent ferme les connexions � chaque requ�te, ce qui pour une page faisant r�f�rence � des images sur le m�me site implique des ouvertures successives de canaux TCP de mani�re inutile.

Vous allez maintenant r�aliser une version de serveur qui accepte de fournir plusieurs contenus sur le m�me canal ouvert.

R�cup�rez le squelette de la classe Http11WorkerBase.java et mettez-la dans le paquetage www.

R�cup�rez la classe Httpd11Base.java et mettez-la dans le paquetage par d�faut.

R�pondez aux questions suivantes puis r�alisez les modifications au niveau des classes :

  1. Puisqu'un worker traite plusieurs requ�tes successives d'un client, comment peut-on permettre que plusieurs clients travaillent avec le m�me serveur ?
  2. Quelles sont les modifications � appliquer au worker ?
  3. Quelles sont les modifications � appliquer au serveur ?

Appliquez ces modifications au code qui vous est fourni.