Académique Documents
Professionnel Documents
Culture Documents
Cours Sockets
Cours Sockets
Eric Cariou
Universit de Pau et des Pays de l'Adour Dpartement Informatique Eric.Cariou@univ-pau.fr
1
TCP ou UDP
Communication entre systmes aux extrmits Pas de visibilit des systmes intermdiaires
Application TCP/UDP IP Liaison Physique IP Liaison Physique
2
Adressage
Adresse IP et numro de port Ex : 192.129.12.34 Ce numro est en entier d'une valeur quelconque
Ports < 1024 : rservs pour les applications ou protocoles systmes Exemple : 80 = HTTP, 21 = FTP, ...
Socket : prise
Sockets
Services d'mission et de rception de donnes sur la socket via le port En mode connect (TCP)
Connexion = tuyau entre 2 applications distantes Une socket est un des deux bouts du tuyau Chaque application a une socket locale pour grer la communication distance Sur un port prcis la demande du programme Sur un port quelconque libre dtermin par le systme 4
Sockets
Elle permet la communication avec un port distant sur une machine distante : c'est--dire avec une application distante 5
Le cot serveur communique via une socket lie un port prcis : port d'coute Le client initie la connexion ou la communication 6
Dissymtrie de la communication/connexion
Sockets UDP
Mode datagramme
Envois de paquets de donnes (datagrammes) Pas de connexion entre parties client et serveur Pas de fiabilit ou de gestion de la communication
Un paquet peut ne pas arriv (perdu par le rseau) Un paquet P2 envoy aprs un paquet P1 peut arriver avant ce paquet P1 (selon la gestion des routes dans le rseau)
Principe de communication
La partie serveur cre une socket et la lie un port UDP particulier La partie client cre une socket pour accder la couche UDP et la lie sur un port quelconque
8
Le serveur se met en attente de rception de paquet sur sa socket Le client envoie un paquet via sa socket en prcisant l'adresse du destinataire
@IP de la machine sur laquelle tourne la partie serveur et numro de port sur lequel est lie la socket de la partie serveur
Si le client envoie un paquet avant que le serveur ne soit prt recevoir : le paquet est perdu
9
10
Classe InetAddress
Constructeurs
Pas de constructeurs, on passe par des mthodes statiques pour crer un objet
public static InetAddress getByName(String host) throws UnknownHostException
Mthodes
Cre un objet InetAddress identifiant une machine dont le nom est pass en paramtre L'exception est leve si le service de nom (DNS...) du systme ne trouve pas de machine du nom pass en paramtre sur le rseau Si prcise une adresse IP sous forme de chane (''192.12.23.24'') au lieu de son nom, le service de nom n'est pas utilis Une autre mthode permet de prciser l'adresse IP sous forme d'un tableau de 4 octets
11
Classe InetAddress
Mthodes (suite)
Retourne l'adresse IP de la machine sur laquelle tourne le programme, c'est--dire l'adresse IP locale Retourne le nom de la machine dont l'adresse est code par l'objet InetAddress
12
Classe DatagramPacket
Structure des donnes en mode datagramme Constructeurs
Cration d'un paquet pour recevoir des donnes (sous forme d'un tableau d'octets) Les donnes reues seront places dans buf length prcise la taille max de donnes lire
Ne pas prciser une taille plus grande que celle du tableau En gnral, length = taille de buf
13
Classe DatagramPacket
Constructeurs (suite)
Cration d'un paquet pour envoyer des donnes (sous forme d'un tableau d'octets) buf : contient les donnes envoyer length : longueur des donnes envoyer
address : adresse IP de la machine destinataire des donnes port : numro de port distant (sur la machine destinataire) o envoyer les donnes
14
Classe DatagramPacket
Mthodes get
InetAddress getAddress()
Si paquet envoyer : adresse de la machine destinataire Si paquet reu : adresse de la machine qui a envoy le paquet Si paquet envoyer : port destinataire sur la machine distante Si paquet reu : port utilis par le programme distant pour envoyer le paquet Donnes contenues dans le paquet Si paquet envoyer : longueur des donnes envoyer Si paquet reu : longueur des donnes reues
int getPort()
byte[] getData
int getLength()
15
Classe DatagramPacket
Mthodes set
Positionne l'adresse IP de la machine destinataire du paquet Positionne le port destinataire du paquet pour la machine distante Positionne les donnes envoyer Positionne la longueur des donnes envoyer
16
Pour tenir dans un seul datagramme IP, le datagramme UDP ne doit pas contenir plus de 65467 octets de donnes
Un datagramme UDP est rarement envoy via plusieurs datagrammes IP Car la plupart des systmes limitent 8 Ko la taille des datagrammes UDP
Pour tre certain de ne pas perdre de donnes : 512 octets max Si datagramme UDP trop grand : les donnes sont tronques
Si tableau d'octets en rception est plus petit que les donnes envoyes
Classe DatagramSocket
Socket en mode datagramme Constructeurs
Cre une nouvelle socket en la liant un port quelconque libre Exception leve en cas de problme (a priori il doit pas y en avoir)
Cre une nouvelle socket en la liant au port local prcis par le paramtre port Exception leve en cas de problme : notamment quand le port est dj occup
18
Classe DatagramSocket
Envoie le paquet pass en paramtre. Le destinataire est identifi par le couple @IP/port prcis dans le paquet Exception leve en cas de problme d'entre/sortie
Reoit un paquet de donnes Bloquant tant qu'un paquet n'est pas reu Quand paquet arrive, les attributs de p sont modifis Les donnes reues sont copies dans le tableau pass en paramtre lors de la cration de p et sa longueur est positionne avec la taille des donnes reues Les attributs d'@IP et de port de p contiennent l'@IP et le port de la socket distante qui a mis le paquet
19
Classe DatagramSocket
Autres mthodes
Ferme la socket et libre le port laquelle elle tait lie Retourne le port local sur lequel est lie la socket
Pour restreindre la communication avec un seul destinataire distant Car par dfaut peut recevoir sur la socket des paquets venant de n'importe o 20
Classe DatagramSocket
Elle retourne normalement si un paquet est reu en moins du temps positionn par l'appel de setSoTimeout L'exception SocketTimeoutException est leve pour indiquer que le dlai s'est coul avant qu'un paquet ne soit reu SocketTimeoutException est une sous-classe de IOException
21
// cration du paquet avec les donnes et en prcisant l'adresse du serveur // (@IP et port sur lequel il coute : 7777) packet = new DatagramPacket(data, data.length, adr, 7777); // cration d'une socket, sans la lier un port particulier socket = new DatagramSocket(); // envoi du paquet via la socket socket.send(packet);
22
DatagramSocket socket; DatagramPacket packet; // cration d'une socket lie au port 7777 DatagramSocket socket = new DatagramSocket(7777); // tableau de 15 octets qui contiendra les donnes reues byte[] data = new byte[15]; // cration d'un paquet en utilisant le tableau d'octets packet = new DatagramPacket(data, data.length); // attente de la rception d'un paquet. Le paquet reu est plac dans // packet et ses donnes dans data. socket.receive(packet); // rcupration et affichage des donnes (une chane de caractres) String chaine = new String(packet.getData(), 0, packet.getLength()); System.out.println(" recu : "+chaine);
23
25
Avantages
Simple programmer (et apprhender) Pas fiable Ne permet d'envoyer que des tableaux de byte
Inconvnients
26
Et attention la taille rserve : si le rcepteur rserve un tableau trop petit par rapport celui envoy, une partie des donnes est perdue Un objet quelconque en byte[] pour l'envoyer Un byte[] en un objet d'un certain type aprs rception Crer les mthodes qui font cela : lourd et dommage de faire des tches de si bas-niveau avec un langage volu comme Java Utiliser les flux Java pour conversion automatique 27
Deux solutions
Pour mettre et recevoir n'importe quel objet via des sockets UDP
En criture : conversion de Object en byte[]
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); ObjectOutputStream objectStream = new ObjectOutputStream(byteStream); objectStream.writeObject(object); byte[] byteArray = byteStream.toByteArray();
Sockets TCP
29
30
Principe de communication
Le serveur lie une socket d'coute sur un certain port bien prcis et appelle un service d'attente de connexion de la part d'un client Le client appelle un service pour ouvrir une connexion avec le serveur
Du cot du serveur, le service d'attente de connexion retourne une socket de service (associe un port quelconque)
Comme avec sockets UDP : le client et le serveur communiquent en envoyant et recevant des donnes via leur socket 31
Mme classe que celle dcrite dans la partie UDP et usage identique
Socket : socket mode connect ServerSocket : socket d'attente de connexion du cot server
32
Classe Socket
Socket mode connect Constructeurs
Cre une socket locale et la connecte un port distant d'une machine distante identifi par le couple address/port
Idem mais avec nom de la machine au lieu de son adresse IP code Lve l'exception UnknownHostException si le service de nom ne parvient pas identifier la machine
Variante de ces 2 constructeurs pour prciser en plus un port local sur lequel sera lie la socket cre 33
Classe Socket
OutputStream getOutputStream()
Retourne le flux de sortie permettant d'envoyer des donnes via la socket Retourne le flux d'entre permettant de recevoir des donnes via la socket
InputStream getInputStream()
public close()
34
Classe Socket
Mthodes get
int getPort()
Renvoie le port distant avec lequel est connect la socket Renvoie l'adresse IP de la machine distante Renvoie le port local sur lequel est lie la socket
InetAddress getAddress()
int getLocalPort()
Si temps dpass lors d'une lecture : exception SocketTimeoutException est leve Par dfaut : temps infini en lecture sur le flux
35
Classe ServerSocket
Cre une socket d'coute (d'attente de connexion de la part de clients) La socket est lie au port dont le numro est pass en paramtre L'exception est leve notamment si ce port est dj li une socket
Mthodes
Attente de connexion d'un client distant Quand connexion est faite, retourne une socket permettant de communiquer avec le client : socket de service Positionne le temps maximum d'attente de connexion sur un accept Si temps coul, l'accept lve l'exception SocketTimeoutException Par dfaut, attente infinie sur l'accept
36
Cot client
// adresse IP du serveur InetAddress adr = InetAddress.getByName("scinfr222"); // ouverture de connexion avec le serveur sur le port 7777 Socket socket = new Socket(adr, 7777);
37
38
// serveur positionne sa socket d'coute sur le port local 7777 ServerSocket serverSocket = new ServerSocket(7777); // se met en attente de connexion de la part d'un client distant Socket socket = serverSocket.accept(); // connexion accepte : rcupre les flux objets pour communiquer // avec le client qui vient de se connecter ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); // attente les donnes venant du client String chaine = (String)input.readObject(); System.out.println(" recu : "+chaine);
39
// affiche les coordonnes du client qui vient de se connecter System.out.println(" ca vient de : " +socket.getInetAddress()+":"+socket.getPort()); // envoi d'une rponse au client output.writeObject(new String("bien recu"));
String chaine; Personne pers; Object obj = input.readObject(); if (obj instanceof String) chaine = (String)obj; if (obj instanceof Personne) pers = (Personne)obj;
40
Sockets TCP
Inconvnients
Ncessite du paralllisme avec des threads (voir suite cours) Mais oblige une bonne structuration cot serveur
41
TCP est fiable et mieux structur Si la fiabilit n'est pas essentielle Si la connexion entre les 2 applications n'est pas utile Exemple
Un thermomtre envoie toutes les 5 secondes la temprature de l'air ambiant un afficheur distant
Pas grave de perdre une mesure de temps en temps Pas grave d'envoyer les mesures mme si l'afficheur est absent
42
A priori TCP mieux adapt car besoin de fiabilit lors des transferts des fichiers, mais
Peu de pertes de paquets TCP gre un protocole assurant la fiabilit impliquant de nombreux changes supplmentaires entre les applications (envoi d'acquittement...) Peu de perte de paquet en UDP en local : peu directement grer la fiabilit au niveau NFS ou applicatif et c'est moins couteux en temps
Dans ce contexte, il n'est pas pnalisant d'utiliser UDP au lieu de TCP pour NFS
43
44
Concurrence
45
Une socket d'coute sert attendre les connexions des clients A la connexion d'un client, une socket de service est initialise pour communiquer avec ce client Envoi de donnes un client
UDP : on prcise l'adresse du client dans le paquet envoyer TCP : utilise la socket correspondant au client UDP : se met en attente d'un paquet et regarde de qui il vient TCP : doit se mettre en attente de donnes sur toutes les sockets actives 46
Tant que des donnes ne sont pas reues Jusqu' la prochaine connexion d'un client distant
Si ne sait pas quel est l'ordonnancement des arrives des donnes des clients ou de leur connexion au serveur
Impossible grer
Un processus en attente de connexion sur le port d'coute Nouvelle connexion : un nouveau processus est cr pour grer la communication avec le nouveau client 47
48