TP 3 Programmation client/serveur 1. Modèle de programmation

publicité
3A Electronique
TP réseaux et sytèmes embarqués
PhL - 20/03/2007 - Page 1 / 5
D:\philippe\doc\ensi\info\TPTini\TP3A_4_TINI.sxw
TP 3 Programmation client/serveur
1. Modèle de programmation
1. Introduction
Au-dessus des protocoles de transmission, on peut construire des applications réparties reposant sur un (ou plusieurs)
serveur et des clients. Les serveurs (machines) fournissent un service (programme), par exemple l'heure, le transfert
de fichiers, à des programmes clients (sur les machines distantes).
Les deux appels de base mis en jeu sont d'une part les demandes du client et d'autre part les réponses du serveur. Dans
des protocoles comme TCP/IP ou UDP/IP, le client émet sa demande vers le serveur en la munissant de la bonne
adresse de machine et de la bonne adresse du service, à savoir, l'adresse IP et le numéro de port. Le serveur à l'écoute
de ce port détecte la demande et répond à la machine cliente sur son port de demande.
2. Les sockets
Ces interfaces de programmation permettent d'implanter des transactions bidirectionnelles entre un fournisseur de
services, le serveur, et un usager de ce service, le client.
Le serveur fournira son service sur le port de communication d'une machine. Certains ports sont réservés pour des
services bien connus, tel que ftp. D'autres sont libres pour les programmeurs.
Le client enverra sa demande au serveur, à l'adresse de la machine et au port du service désiré.
Le serveur répondra sur le port du client.
L'interface, de programmation la plus fréquente est l'API socket Berkeley en C. Elle existe pour Unix et Window's et
bien d'autres sytèmes. Elle permet des transactions sous la norme TCP/IP ou UDP/IP, en mode connecté ou
datagramme. Les « sockets » ressemblent, du point de vue de l'utilisateur, à des entrées-sorties vers un fichier. À
chaque « socket » correspond, en langage C, un descripteur entier qui servira de référence à ces entrées-sorties.
3. Les interfaces de programmation de Java
1. Vue générale
Le langage Java permet une intégration facile des programmes au réseau Internet. Les appels sont plus simples et
mieux conçus que l'interface Berkeley. Comme elle, Java comporte les transmissions en mode connecté et en mode
datagramme. Nous n'examineront ici que les échanges connectés (TCP).
Dans le mode connecté, le client se connectera au serveur qui établira pour lui une connexion particulière.
Les appels au réseau de Java sont intégrés au paquetage java.net. Ils comprennent la classe Socket, pour le client, et
3A Electronique
TP réseaux et sytèmes embarqués
PhL - 20/03/2007 - Page 2 / 5
D:\philippe\doc\ensi\info\TPTini\TP3A_4_TINI.sxw
ServerSocket pour le serveur.
2. Classe java.net.ServerSocket (socket serveur)
Elle permet d'écouter un port spécifié et d'attacher une socket client à chaque connexion à ce port.
Les classes suivantes sont définies dans des packages spécifiques il faut donc les importer en mettant ces lignes en
début de programme :
import java.net.* ;
import java.io.* ;
Pour attacher une socket serveur au port 1999 par exemple :
ServerSocket priseServeur = null ;
try { priseServeur = new ServerSocket(1999) ;}
catch (IOException e) {System.out.println ("erreur"+e); System.exit(1);}
Pour écouter le port et créer une socket client on utilise la méthode accept() qui est bloquante.
Socket priseClient=null;
try { priseClient=priseServeur.accept();}
catch (IOException e) { System.out.println ("erreur"+e); System.exit(1);}
Comme toutes les entrées/sorties en Java, on y accède par des flux (stream). Il existe plusieurs types de flux
("bufferisés" ou non, avec formatage des données ou non, etc...). Pour la communication avec les sockets, les flux
peuvent être vus comme la couche "présentation" du modèle OSI. Certes minimale, elle permet d'envoyer par
exemple les caractères codés en ASCII alors que la représentation interne est en Unicode.
Par exemple, pour attacher un flux d'entrée qui lit du texte "bufferrisé" :
BufferedReader fi=new BufferedReader( new InputStreamReader (priseClient.getInputStream()));
Pour attacher un flux de sortie qui écrit du texte :
PrintWriter fo = null ;
try { fo = new PrintWriter ( priseClient.getOutputStream()); } ...
Pour lire une chaîne de caractère terminée par "fin de ligne" on utilise la méthode readLine qui est bloquante :
String chaine = null ;
try { chaine = fi.readLine(); } ...
Pour écrire une chaîne de caractère dans le flux :
fo.println("kekchose") ; fo.flush() ;
Il faut évidemment avant de terminer, fermer les flux et les sockets pour libérer les ressources.
try { fi.close() ; fo.close(); priseClient.close() ; priseServeur.close(); }...
Quelques méthodes de la classe ServerSocket
Constructeurs :
public ServerSocket(int port)
Méthodes :
public
public
public
public
public
InetAddress getInetAddress()
int getLocalPort()
Socket accept()
void close()
String toString()
3. Classe java.net.Socket (socket client)
Cette classe s'utilise plus ou moins de la même manière que la classe ServerSocket sauf :
- il n'y a pas de méthode accept() (c'est une socket pour un programme client).
- il faut passer l'adresse de la machine destinataire et le port au constructeur.
par exemple pour atteindre la machine e3000 et l'application attachée au port 1999:
Socket priseClient = null ;
try {Socket priseClient =new Socket("e3000", 1999);} catch(IOException e ) {...}
Quelques méthodes de la classe Socket
Constructeurs :
protected Socket()
public Socket(String host, int port)
Méthodes :
3A Electronique
TP réseaux et sytèmes embarqués
public
public
public
public
public
public
public
public
PhL - 20/03/2007 - Page 3 / 5
D:\philippe\doc\ensi\info\TPTini\TP3A_4_TINI.sxw
InetAddress getInetAddress()
InetAddress getLocalAddress()
int getPort()
int getLocalPort()
InputStream getInputStream()
OutputStream getOutputStream()
synchronized void close()
String toString()
4. Travail à faire
1) Écrire un programme qui rendra le service suivant :
• Afficher un message de bienvenue ;
• demander une phrase ;
• convertir cette phrase en majuscule (méthode toUpperCase() de la classe String ) ;
• recommencer si cette cette phrase est différente de « bye ».
On testera ce programme par telnet. Telnet permet de se connecter à distance sur une autre machine. Mais en fait, c'est
un programme qui ne fait qu'envoyer sur le réseau ce qui est frappé au clavier et affiche à l'écran ce qu'il reçoit. Tout
le travail d'interprétation des commandes est fait à distance sur le serveur. Par défaut telnet se connecte au port 23.
Pour se connecter à un autre port : telnet 192.168.29.X no_port
2) Écrire maintenant un programme ressemblant à Telnet. Ce programme sera lancé sur le PC. Pour interroger le
clavier on construira un BufferedReader à partir du flux Sytem.in.
3) Essayez de vous connecter aux programmes de vos camarades.
4) Les programmes précédents ont un défaut. Ils ne permettent pas à plusieurs clients de se connecter. Reprendre le
programme serveur de majuscule et le rendre « multi-client ».
2. Serveur Web
Un serveur web est une application dont le service de base est de distribuer des fichiers écrits en HTML. On se
propose d'écrire un programme affichant des relevés de températures.
Lorsqu'un utilisateur tape ceci dans la barre d'URL de son navigateur :
http://machine.nomDeDomaine:1999/repertoire/fichier.html
Le navigateur essaye de se connecter à la machine « machine.nomDedomaine » et à un programme écoutant le port
1999. Ensuite, il envoie une série de chaînes de caractères dont la première est :
"GET /repertoire/fichier.html HTTP/1.1\n\n"
Le serveur renvoie alors une entête HTTP qui est une chaîne de caractères qui précise entre autre la version du
protocole HTTP, un code d’erreur (200 : pas d’erreur) et le type de document transporté. Par exemple :
"HTTP/1.1 200 OK \n content-type: text/html \n\n"
Ensuite, le serveur envoie le fichier d'un seul bloc, puis ferme la connexion.
Si le fichier est absent, il renvoie la chaîne suivante à la place :
"http/1.1 404 ERROR\n\n" et fermer la connexion.
Le port par défaut des serveurs web est 80 et non pas 1999.
Travail à faire
1) Écrire un programme qui écoute le port 80 et affiche tout ce qu'il reçoit à l'écran. Connectez-vous à ce programme
avec un navigateur web.
2) Écrire un programme qui renvoie une page web statique, quelque soit la requette du navigateur. Attention à bien
transmettre l'entête HTTP avant le code HTML.
3) Écrire un programme qui décortique la requête du navigateur et renvoie une page web stockée sur le disque dur.
4) Écrire un programme qui lorsqu'il est interrogé par un navigateur donnera une page HTML contenant les 10
derniers relevés de température. Les températures seront prises avec un intervalle de 10s. Vous ferez un affichage
graphique en vous inspirant du code HTML donné en annexe. On prendra soin de synchroniser les méthodes
d'accès aux 10 derniers relevés afin de gérer l'accès concurrent.
5) Écrire maintenant un serveur web proposant soit de remettre à zéro la base de données après une authentification
sur une page, soit de visualiser les 10 derniers relevés sur une autre page (ou dans un cadre pour les plus en
avance).
3A Electronique
TP réseaux et sytèmes embarqués
PhL - 20/03/2007 - Page 4 / 5
D:\philippe\doc\ensi\info\TPTini\TP3A_4_TINI.sxw
Annexes
Barres horizontales
<HTML>
<BODY>
<table border bgcolor=white>
<tr> <td width=80 bgcolor=yellow> 09h00</td> <td width=220 bgcolor=green>
</tr>
</table>
<table border=1 bgcolor=white>
<tr> <td width=80 bgcolor=yellow> 10h00</td> <td width=240 bgcolor=green>
</tr>
</table>
</BODY>
</HTML>
Dont le résultat est présenté ici :
09h00
10h00
</td> <td> 22° </td>
</td> <td> 24° </td>
22°
24°
Formulaire
<HTML>
<BODY>
<center><b>Formulaire de remise à zéro</b></center><br>
<FORM METHOD=GET ACTION=./prog_pipo.exe>
Login <INPUT name="login"><br>
Mot de passe <INPUT name="mdp" TYPE="PASSWORD"><br>
<INPUT VALUE="OK" TYPE="SUBMIT">
<INPUT VALUE="Effacer" TYPE="RESET" >
</FORM>
</BODY>
</HTML>
Un navigateur qui reçoit cette page affiche le formulaire (cf. page suivante). Puis l'utilisateur rempli les
champs avec par exemple « toto » et « titi »et appuie sur OK. Dans ce cas le navigateur envoie la requête
suivante :
GET ./prog_pipo.exe?login=toto&mdp=titi HTTP/1.1
Normalement le serveur web exécute un programme qui s'appelle ici « prog_pipo.exe » et renvoie le résultat
de ce programme au navigateur.
Dans notre cas, notre programme n'exécutera pas de programme tiers, mais effectuera un traitement afin de
vérifier le mot de passe et renvoyer une page web adéquat.
3A Electronique
TP réseaux et sytèmes embarqués
Architecture
PhL - 20/03/2007 - Page 5 / 5
D:\philippe\doc\ensi\info\TPTini\TP3A_4_TINI.sxw
Téléchargement