6 Sock RPC RAR M1
6 Sock RPC RAR M1
6 Sock RPC RAR M1
Plan de la suite
Problme x Raliser un service rparti en utilisant linterface de transport (TCP, UDP) Solutions x Sockets : mcanisme universel de bas niveau, utilisable depuis tout langage (exemple : C, Java) x Appel de procdure distance (RPC), dans un langage particulier ; exemple : C x Appel de mthode distance, dans les langages objets ; exemple : Java RMI x Middleware intgr : CORBA, EJB, .Net, Web Services Exemples x Exemples de services usuels : DNS, Web
Sacha Krakowiak
Universit Joseph Fourier Projet Sardes (INRIA et IMAG-LSR) http://sardes.inrialpes.fr/people/krakowia
Cours 8
2003-2004, S. Krakowiak
"socket serveur"
4321
rponse
Serveur
2) le client se connecte la socket serveur ; deux sockets sont alors cres : une " socket client", ct client, et une "socket service client" ct serveur. Ces sockets sont connectes entre elles
"socket serveur" "socket client" client 36243 "socket service client"
serveur
4321 56432
3) Le client et le serveur communiquent par les sockets. Linterface est celle des fichiers (read, write). La socket serveur peut accepter de nouvelles connexions
2003-2004, S. Krakowiak
2003-2004, S. Krakowiak
s Points communs
x Le client a linitiative de la communication ; le serveur doit tre lcoute x Le client doit connatre la rfrence du serveur [adresse IP, n de port] (il peut la trouver dans un annuaire si le serveur ly a enregistre au pralable, ou la connatre par convention : ns de port praffcts) x Le serveur peut servir plusieurs clients (1 thread unique ou 1 thread par client)
2003-2004, S. Krakowiak
s Contraintes
x le client doit avoir accs ladresse du serveur (adresse IP, n de port)
2003-2004, S. Krakowiak
Le client ouvre une connexion avec le serveur avant de pouvoir lui adresser des appels, puis ferme la connexion la fin de la suite doprations x dlimitation temporelle des changes x maintien de ltat de connexion pour la gestion des paramtres de qualit de service y traitement des pannes, proprit dordre
x Les diffrentes oprations de gestion de sockets (socket, bind, etc.) sont fournies comme primitives (appel systmes) dans Unix (et dautres systmes dexploitation) x Si intresss, lirer les pages man de ces oprations x On peut utiliser directement ces oprations, mais les langages usuels fournissent des outils facilitant leur usage et couvrant les cas courants, ct client et ct serveur y bibliothques spcialises en C y classes en Java
Orient vers x le traitement ordonn dune suite dappels y ordre local (requtes dun client traites dans leur ordre dmission), global ou causal x la gestion de donnes persistantes ou de protocoles avec tat
s La suite
x Nous allons regarder de plus prs (cours et TP) la programmation des sockets en Java x Si intresss par la programmation de sockets en C, voir rfrences cidessous (contiennent des exemples)
Livres J. M. Rifflet, J.-B. Yuns. Unix - Programmation et Communication, Dunod (2003), chap. 19 R. Stevens. Unix Network Programming. Prentice-Hall. http://www.eng.auburn.edu/department/cse/classes/cse605/examples/index.html http://www.scit.wlv.ac.uk/~jphb/comms/sockets.html
Web
2003-2004, S. Krakowiak
2003-2004, S. Krakowiak
Maintenant le client et le serveur sont connects PrintWriter out = new PrintWriter( mySocket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader( mySocket.getInputStream())); PrintWriter out = new PrintWriter( clientServicetSocket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader( clientServiceSocket.getInputStream()));
Maintenant le client et le serveur peuvent communiquer via les canaux BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in)); String request; String reply; while (true) { request = stdln.readLine(); // l'utilisateur entre la requte out.println(request); // envoyer la requte au serveur reply = in.readLine() // attendre la rponse System.out.println(reply); // imprimer la rponse }
2003-2004, S. Krakowiak
String request; String reply; while (true) { request = in.readLine() // executer le service // traiter request pour fournir reply out.println(reply); }
Voir http://java.sun.com/docs/books/tutorial/networking/sockets/
2003-2004, S. Krakowiak
Complments divers
Importer les packages utiles
import java.io.*; import java.net.*; import java.io.*; import java.net.*;
Prvoir terminaison
(dpend de lapplication)
Terminer proprement
out.close(); in.close(); mySocket.close();
while (true) { accepter la connexion dun nouveau client et crer une socket service client; crer un thread pour interagir avec ce client sur la nouvelle socket service client; }
client 1 crer
client 2
Un serveur multi-thread
programme des excutants programme du veilleur serverSocket = new ServerSocket(7654); while (true) { Socket clientServiceSocket = serverSocket.accept() ; Service myService = new Service(clientServiceSocket) ; // cre un nouveau thread // pour le nouveau client myService.start () ; // lance lexcution du thread }
public class Service extends Thread { protected final Socket socket ; String request, reply; public myService(Socket socket) { this.socket - socket ; { public void run () { PrintWriter out = new PrintWriter( clientServicetSocket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader( clientServiceSocket.getInputStream())); try { request = in.readLine() ; // excuter le service // traiter request pour fournir reply out.println(reply); } finally { socket.close () ; } } }
2003-2004, S. Krakowiak
s Caractristiques
x pas dtablissement pralable dune connexion x Pas de garantie de fiabilit x adapt aux applications pour lesquelles les rponses aux requtes des clients sont courtes (1 message) x le rcepteur reoit les donnes selon le dcoupage effectu par lmetteur
s Contraintes
x le client doit avoir accs ladresse du serveur (adr. IP, port) x le serveur doit rcuprer ladresse de chaque client pour lui rpondre (primitives sendto, recvfrom)
1 2003-2004, S. Krakowiak
moment
x mode lger permettant y le traitement non ordonn des appels y labsence de mmorisation entre appels successits (serveur sans donnes rmanentes et sans tat) x exemples y calcul de fonction numrique y DNS (service de noms) y NFS (service de fichiers rpartis)
x DatagramSocket : un seul type de socket x DatagramPacket : format de message pour UDP y Conversion entre donnes et paquet (dans les 2 sens)
packet = new DatagramPacket(data, data.length, adresseIP, port)
data
packet
DatagramPacket
dat
s Utilisation
x changes simples (question-rponse) x Messages brefs x "Streaming temps rel (performances)
2003-2004, S. Krakowiak 1 2003-2004, S. Krakowiak 1
processus p
processus p
P(x, y, )
while (true) { DatagramPacket inpacket = new DatagramPacket (receiveBuffer, receiveBuffer.length); socket.receive(inpacket ) ; request = InetAddress.getbyname("goedel.imag.fr"), new String(receiveBuffer.getData); 7654) ; // dterminer adresse et port du client socket.send(outpacket) ; doit tre connu du client Rception InetAddress clentAddress = inpacket.getAddress( int clienPort = inpacket. DatagramPacket inpacket = requte // executer service : traiter request pour fournir rep new DatagramPacket (receiveBuffer, sendBuffer = reply.getBytes() ; receiveBuffer.length); DatagramPacket outpacket = socket.receive(inpacket ); Envoi new DatagramPacket (sendBuffer, reply = new String(inpacket.getData()); rponse sendBuffer.length, clientAddress, clienPort); Envoi requte socket.send(outpacket); Rception rponse }
2003-2004, S. Krakowiak
procedure P(x, y, )
P(x, y, )
Leffet de lappel doit tre identique dans les deux situations. Mais cet objectif ne peut tre atteint en toute rigueur en prsence de dfaillances (cf plus loin)
1 2003-2004, S. Krakowiak
P(x, y, )
niveau application
P(x, y, )
s Problmes de ralisation
x Transmission des paramtres (conversion entre la forme interne, propre un langage, et une forme adapte la transmission) x Gestion des processus x Raction aux dfaillances y Trois modes de dfaillance indpendants : client, serveur, rseau
emballer paramtres envoyer paramtres attente recevoir rsultats dballer resultats send receive
logiciel de communication (sockets)
niveau middleware
recevoir paramtres dballer paramtres appel procdure emballer rsultats envoyer rsultats
rseau
receive send
logiciel de communication (sockets)
Les talons client et serveur sont crs partir dune description dinterface
2
2003-2004, S. Krakowiak
1 2003-2004, S. Krakowiak
/* constantes et types */ const max_nom = 20 ; const max_adr = 50 ; const max_numero = 16 ; typedef string typenom<max_nom> ; typedef string typeadr<max_adr> ; typedef string typenumero<max_numero> ; struct personne { typenumero numero ; typenom nom ; typeadr adresse ; }; typedef struct personne personne ; /* description de l interface */ program ANNUAIRE { version V1 { void INIT(void) = 1; int AJOUTER(personne p) = 2 ; int SUPPRIMER (personne p) = 3 ; personne CONSULTER (typenom nom) = 4 ; }=1; } = 0x23456789 ;
Description dinterface
#include "annuaire.h" void * nit_1_svc(void *argp, struct svc_req *rqstp) { static char * result; /* le programme de la fonction init */ return (void *) &result; } nt * ajouter_1_svc(personne *argp, struct svc_req *rqstp) { static int result; /* le programme de la fonction ajouter */ return &result; }
int * supprimer_1_svc(personne *argp, struct svc_req *rqstp) { static int result; /* le programme de la fonction supprimer */ return &result; } personne * consulter_1_svc(typenom *argp, struct svc_req *rqstp) { static personne result; /* le programme de la fonction consulter */ return &result; }
2003-2004, S. Krakowiak
2 2003-2004, S. Krakowiak
/* saisir paramtres */
/* afficher rsultats */
gcc
application client proc_client.c talon client proc_clnt.c
excutable client
memset((char *)&clnt_res, 0, sizeof(clnt_res)); if (clnt_call (clnt, INIT, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_void, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return ((void *)&clnt_res); } int * ajouter_1(personne *argp, CLIENT *clnt) { static int clnt_res; memset((char *)&clnt_res, 0, sizeof(clnt_res)); if (clnt_call (clnt, AJOUTER, (xdrproc_t) xdr_personne, (caddr_t) argp, (xdrproc_t) xdr_int, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } 2003-2004, S. Krakowiak
} personne * consulter_1(typenom *argp, CLIENT *clnt) { static personne clnt_res; memset((char *)&clnt_res, 0, sizeof(clnt_res)); if (clnt_call (clnt, CONSULTER, (xdrproc_t) xdr_typenom, (caddr_t) argp, (xdrproc_t) xdr_personne, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); }
rpcgen
conversion proc_xdr.c
dfinitions proc.h
bibliothques
talon serveur proc_svc.c application serveur proc_server.c fourni par programmeur outils et services engendr automatiquement
2
gcc
excutable serveur
2 2003-2004, S. Krakowiak
s Passage de paramtres
x Pas de passage par rfrence (car les pointeurs perdent leur signification) x Conversion des donnes (dpend du type et des conventions de reprsentation - il existe des standards)
s Dsigantion
x Comment le client dtermine ladresse du serveur (et vice-versa)
x Si le client envoie de nouveau la requte y Pas de problme dans le cas a) y Lappel sera excut 2 fois dans le cas b)
v Remde : associer un numro unique chaque requte
Matriau complmentaire
(non prsent en cours)
s Limitations
x La structure de lapplication est statique : pas de cration dynamique de serveur, pas de possibilit de redploiement entre sites x Pas de passage des paramtres par rfrence x La communication est rduite un schma synchrone x La persistance des donnes nest pas assure (il faut la raliser explicitement par sauvegarde des donnes dans des fichiers) x Des mcanismes plus volus visent remdier ces limitations y Objets rpartis (ex : Java RMI, voir en cours) y Composants rpartis (ex : EJB, Corba CCM, .Net)
2003-2004, S. Krakowiak 3 2003-2004, S. Krakowiak
x 1. Cration de la socket serveur x 2. Rcupration de ladresse IP et du numro de port du serveur ; lien de la socket ladresse du serveur x 3. Mise en mode passif de la socket : elle est prte accepter les requtes des clients x 4. (opration bloquante) : acceptation dune connexion dun client et cration dune socket service client, dont lidentit est rendue en retour x 5. et 6. Lecture, traitement et criture (selon algorithme du service) x 7. Fermeture et remise en attente
1 2 3 4 5
read()
write()
x 1. Cration de la socket x 2. Connexion de la socket au serveur y choix dun port libre pour la socket par la couche TCP y attachement automatique de la socket ladresse (IP machine locale + n de port) y connexion de la socket au serveur en passant en paramtre ladresse IP et le n de port du serveur x 3. et 4. Dialogue avec le serveur (selon algorithme du service) x 5. Fermeture de la connexion avec le serveur
1 2
socket() connect()
read()
write()
close(s)
close() shutdown()
2003-2004, S. Krakowiak
3 2003-2004, S. Krakowiak
Veilleur
t=socket() bind()
Client x 1. Cration de la socket x 2. Rcupration de ladresse IP et du numro de port du serveur ; lien de la socket ladresse du serveur x 3. Rception dune requte de client x 4. Traitement de la requte ; prparation de la rponse x 5. Rponse la requte en utilisant la socket et ladresse du client obtenues par recvfrom ; retour pour attente dune nouvelle requte 3 1 2
socket() bind()
recvfrom()
traitement
write() close(s)
sendto()
2003-2004, S. Krakowiak
3 2003-2004, S. Krakowiak
Veilleur
x 1. Cration de la socket (lassociation une adresse locale [adresse IP + n port] est faite automatiquement lors de lenvoi de la requte) x 2. Envoi dune requte au serveur en spcifiant son adresse dans lappel x 3. Rception de la rponse la requte x 4. Fermeture de la socket
sendto()
recvfrom()
traitement
fork()
traitement
recvfrom()
[bloquant]
sendto()
4
close()
sendto() exit()
suite du programme
2003-2004, S. Krakowiak
3 2003-2004, S. Krakowiak