TD 1

Cours "Protocoles de réseaux" de majeure d'informatique 2 par Walid Dabbous.

Le but de ce TD est d'établir des communications réseau en java. Les mécanismes utilisés seront vus plus tard dans le cours. Les fonctions haut niveau de java permettent d'établir des communications sans connaître ces mécanismes.

Exercice 1. Lire le source de pages web

Le but de l'exercice est d'écrire un programme qui prend en argument un nom de serveur web, son numéro de port et le chemin local d'une URI, se connecte au serveur, récupère la page en question et l'affiche.

Pour récupérer une page web, il suffit de se connecter au port du serveur web (80 par défaut) de la machine et envoyer le texte d'une requête. Par exemple on peut récupérer le source de l'URI http://www.inria.fr:80/recherche/index.fr.html ainsi :

triton:~/progs$ telnet www.inria.fr 80
GET /recherche/index.fr.html HTTP/1.0
Host: www.inria.fr

...

La commande telnet se contente d'ouvrir un "socket" vers la machine et le port passés en argument, puis d'envoyer le texte tapé au clavier et afficher ce que le serveur distant renvoie. Un socket est une sorte de tuyau de communication par lequel on peut envoyer des caractères et en recevoir. La manière de spécifier la requête est standardisé dans la norme HTTP/1.0. Il suffit de savoir qu'il faut envoyer GET chemin_local_de_l_url HTTP/1.0 suivi d'un caractère fin de ligne ("\n") suivi de Host: nom_du_serveur suivi de deux caractères de fin de ligne.

Il s'agit donc de programmer en java un analogue de la commande telnet. Il suffit pour cela d'ouvrir un socket :

import java.net.* ;

...

      try {
	 Socket sock = new Socket (addr, port) ;
      } catch (UnknownHostException e) {
	 System.out.println ("Serveur inconnu : " + addr.getHostName ()) ;
      } catch (IOException e) {
	 System.out.println ("Erreur de connexion.") ;
      } 

...

sock.getOutputStream () renvoie un OutputStream qui permet d'envoyer des caractères par le socket sock et sock.getInputStream () renvoie un InputStream qui permet de lire les caractères reçus par le socket. Pour plus de facilité, on pourra transformer ces streams en BufferedWriter et BufferedReader pour les manier avec plus de facilités :

      BufferedWriter out = new BufferedWriter (new OutputStreamWriter(sock.getOutputStream ())) ;
      BufferedReader inp = new BufferedReader (new InputStreamReader(sock.getInputStream ())) ;

Ne pas oublier d'utiliser flush pour vider le buffer d'écriture après avoir écrit la requête.

Documentation java sur le sujet :

Une solution.

Exercice 2. Un faux serveur web

Écrire un serveur web qui interprète le chemin local des uris comme le nom d'un répertoire local et affiche la liste des fichiers du répertoire. On pourra insérer des liens hypertexte pour les fichiers qui sont eux même des répertoires.

Documentation java sur le sujet :

Une solution.

Exercice 3. Serveur web multithread

Répondre à plusieurs requête en même temps. Pour répondre cela, il faut créer un thread par socket de client. Faire des clients très lents pour pouvoir tester votre serveur.


Sujet proposé par Laurent Viennot Last modified: Sun Jan 12 23:47:31 CET 2003

Valid HTML 4.0!