Vous êtes sur la page 1sur 48

Systmes distribus Sockets TCP/UDP et leur mise en uvre en Java

Eric Cariou
Universit de Pau et des Pays de l'Adour Dpartement Informatique Eric.Cariou@univ-pau.fr
1

Rappel sur les rseaux

TCP ou UDP
Communication entre systmes aux extrmits Pas de visibilit des systmes intermdiaires
Application TCP/UDP IP Liaison Physique IP Liaison Physique
2

Application TCP/UDP IP Liaison Physique

Communication dextrmit extrmit

Adressage pour communication entre applications


Adresse rseau application = couple de 2 informations

Adressage

Adresse IP et numro de port Ex : 192.129.12.34 Ce numro est en entier d'une valeur quelconque

Couche rseau : adresse IP

Couche transport : numro de port TCP ou UDP

Ports < 1024 : rservs pour les applications ou protocoles systmes Exemple : 80 = HTTP, 21 = FTP, ...

Sur un port : rception ou envoi de donnes

Adresse note : @IP:port ou nomMachine:port

192.129.12.34:80 : accs au serveur Web tournant sur la machine d'adresse IP 192.129.12.34 3

Socket : prise

Sockets

Associe, lie un port


C'est donc un point d'accs aux couches rseaux

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

Une socket peut-tre lie


Sockets

Une socket est


Un point d'accs aux couches rseau TCP/UDP Lie localement un port

Adressage de l'application sur le rseau : son couple @IP:port

Elle permet la communication avec un port distant sur une machine distante : c'est--dire avec une application distante 5

Il y a toujours diffrenciation entre une partie client et une partie serveur


Deux rles distincts au niveau de la communication via TCP/UDP Mais possibilit que les lments communiquant jouent un autre rle ou les 2 en mme temps Identification : on doit connatre prcisment la localisation d'un des 2 lments communiquants

Client/serveur avec sockets

Diffrenciation pour plusieurs raisons

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

Sockets UDP : principe

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

Principe de communication (suite)

Sockets UDP : principe

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

Couple @IP/port Destinataire = partie serveur

@IP de la machine sur laquelle tourne la partie serveur et numro de port sur lequel est lie la socket de la partie serveur

Il est reu par le serveur (sauf pb rseau)

Si le client envoie un paquet avant que le serveur ne soit prt recevoir : le paquet est perdu
9

Sockets UDP en Java

Java intgre nativement les fonctionnalits de communication rseau au dessus de TCP-UDP/IP


Package java.net InetAddress : codage des adresses IP DatagramSocket : socket mode non connect (UDP) DatagramPacket : paquet de donnes envoy via une socket sans connexion (UDP)

Classes utilises pour communication via UDP

10

Classe InetAddress
Constructeurs

Sockets UDP en Java

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

Sockets UDP en Java

Classe InetAddress
Mthodes (suite)

public static InetAddress getLocalHost() throws UnknownHostException

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

public String getHostName()

12

Sockets UDP en Java

Classe DatagramPacket
Structure des donnes en mode datagramme Constructeurs

public DatagramPacket(byte[] buf, int length)


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

Variante du constructeur : avec un offset pour ne pas commencer au dbut du tableau

13

Sockets UDP en Java

Classe DatagramPacket
Constructeurs (suite)

public DatagramPacket(byte[] buf, int length, InetAddress address, int port)


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

Ne pas prciser une taille suprieure celle de buf

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

Sockets UDP en Java

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

Sockets UDP en Java

Classe DatagramPacket
Mthodes set

void setAddress(InetAdress adr)

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

void setPort(int port)

void setData(byte[] data)

int setLength(int length)

16

Classe DatagramPacket, complment sur les tailles des donnes envoyes


Java n'impose aucune limite en taille pour les tableaux d'octets circulant dans les paquets UDP, mais

Sockets UDP en Java

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

Mais en pratique : il est conseill de ne pas dpasser 8176 octets

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

Les donnes reues sont gnralement tronques 17

Sockets UDP en Java

Classe DatagramSocket
Socket en mode datagramme Constructeurs

public DatagramSocket() throws SocketException


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)

public DatagramSocket(int port) throws SocketException


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

Sockets UDP en Java

Mthodes d'mission/rception de paquet


public void send(DatagramPacket p) throws IOException

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

public void receive(DatagramPacket p) throws IOException


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

Sockets UDP en Java

public void close()

Ferme la socket et libre le port laquelle elle tait lie Retourne le port local sur lequel est lie la socket

public int getLocalPort()

Possibilit de crer un canal (mais toujours en mode non connect)


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

Sockets UDP en Java

Rception de donnes : via mthode receive


Mthode bloquante sans contrainte de temps : peut rester en attente indfiniment si aucun paquet n'est jamais reu public void setSoTimeout(int timeout) throws SocketException L'appel de la mthode receive sera bloquante pendant au plus timeout millisecondes Une mthode receive se terminera alors de 2 faons

Possibilit de prciser un dlai maximum d'attente


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

Sockets UDP Java exemple cot client


InetAddress adr; DatagramPacket packet; DatagramSocket socket; // adr contient l'@IP de la partie serveur adr = InetAddress.getByName("scinfr222"); // donnes envoyer : chane de caractres byte[] data = (new String("youpi")).getBytes();

// 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

Sockets UDP Java exemple cot serveur

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

Sockets UDP en Java exemple suite

La communication se fait souvent dans les 2 sens


Le serveur doit donc connatre la localisation du client Elle est prcise dans le paquet qu'il reoit du client
System.out.println(" ca vient de : "+packet.getAddress()+":"+ packet.getPort()); // on met une nouvelle donne dans le paquet // (qui contient donc le couple @IP/port de la socket cot client)
packet.setData((new String("bien recu")).getBytes());

Rponse au client, cot serveur

// on envoie le paquet au client socket.send(packet); 24

Sockets UDP en Java exemple suite

Rception rponse du serveur, cot client


// attente paquet envoy sur la socket du client socket.receive(packet); // rcupration et affichage de la donne contenue dans le paquet String chaine = new String(packet.getData(), 0, packet.getLength()); System.out.println(" recu du serveur : "+chaine);

25

Critique sockets UDP

Avantages
Simple programmer (et apprhender) Pas fiable Ne permet d'envoyer que des tableaux de byte

Inconvnients

26

Structure des donnes changes

Format des donnes transmettre


Trs limit a priori : tableaux de byte

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

Doit donc pouvoir convertir


Deux solutions

Conversion Object <-> byte[]

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();

En lecture : conversion de byte[] en Object


ByteArrayInputStream byteStream = new ByteArrayInputStream(byteArray); ObjectInputStream objectStream = new ObjectInputStream(byteStream); object = objectStream.readObject(); 28

Sockets TCP

29

Fonctionnement en mode connect

Sockets TCP : principe

Donnes envoyes dans un tuyau et non pas par paquet


Flux de donnes Correspond aux flux Java dans la mise en oeuvre Java des sockets TCP Les donnes envoyes sont toutes reues par la machine destinataire Les donnes sont reues dans l'ordre o elles ont t envoyes

Fiable : la couche TCP assure que


30

Principe de communication

Sockets TCP : principe

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

Il rcupre une socket (associe un port quelconque par le systme)

Du cot du serveur, le service d'attente de connexion retourne une socket de service (associe un port quelconque)

C'est la socket qui permet de dialoguer avec ce client

Comme avec sockets UDP : le client et le serveur communiquent en envoyant et recevant des donnes via leur socket 31

Sockets TCP en Java

Classes du package java.net utilises pour communication via TCP


InetAddress : codage des adresses IP

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

Sockets TCP en Java

Classe Socket
Socket mode connect Constructeurs

public Socket(InetAddress address, int port) throws IOException

Cre une socket locale et la connecte un port distant d'une machine distante identifi par le couple address/port

public Socket(String address, int port) throws IOException,UnknownHostException


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

Sockets TCP en Java

Mthodes d'mission/rception de donnes


Contrairement aux sockets UDP, les sockets TCP n'offre pas directement de services pour mettre/recevoir des donnes On rcupre les flux d'entre/sorties associs la 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()

Fermeture d'une socket

public close()

Ferme la socket et rompt la connexion avec la machine distante

34

Classe Socket

Sockets TCP en Java

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()

public void setSoTimeout(int timeout) throws SocketException

Positionne l'attente maximale en rception de donnes sur le flux d'entre de la socket


Si temps dpass lors d'une lecture : exception SocketTimeoutException est leve Par dfaut : temps infini en lecture sur le flux

35

Classe ServerSocket

Sockets TCP en Java

Socket d'attente de connexion, cot serveur uniquement Constructeurs

public ServerSocket(int port) throws IOException


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

Socket accept() throws IOException


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

void setSoTimeout(int timeout) throws SocketException


36

Sockets TCP Java exemple cot client

Mme exemple qu'avec UDP


Connexion d'un client un serveur Envoi d'une chane par le client et rponse sous forme d'une chane par le serveur

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

Sockets TCP Java exemple cot client

Cot client (suite)


// construction de flux objets partir des flux de la socket ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); // criture d'une chane dans le flux de sortie : c'est--dire envoi de // donnes au serveur output.writeObject(new String("youpi")); // attente de rception de donnes venant du serveur (avec le readObject) // on sait qu'on attend une chane, on peut donc faire un cast directement String chaine = (String)input.readObject(); System.out.println(" recu du serveur : "+chaine);

38

Sockets TCP Java exemple cot serveur

// 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

Sockets TCP Java exemple cot serveur

Cot serveur (suite)

// 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"));

Quand manipule des flux d'objets


Souvent utile de vrifier le type de l'objet reu Utilise instanceof Exemple

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

Critique sockets TCP


Avantages

Niveau d'abstraction plus lev qu'avec UDP


Mode connect avec phase de connexion explicite Flux d'entre/sortie

Fiable Plus difficile de grer plusieurs clients en mme temps


Inconvnients

Ncessite du paralllisme avec des threads (voir suite cours) Mais oblige une bonne structuration cot serveur

41

Sockets UDP ou TCP ?

Choix entre UDP et TCP


A priori simple

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

Mais intrt tout de mme pour UDP dans certains cas


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

Exemple de protocole utilisant UDP : NFS


Network File System (NFS)

Sockets UDP ou TCP ?

Accs un systme de fichiers distant

A priori TCP mieux adapt car besoin de fiabilit lors des transferts des fichiers, mais

NFS est gnralement utilis au sein d'un rseau local

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

UDP est plus basique et donc plus rapide


Dans ce contexte, il n'est pas pnalisant d'utiliser UDP au lieu de TCP pour NFS

NFS fonctionne sur ces 2 couches

43

Serveur en gestion multi-clients

44

Par principe, les lments distants communiquants sont actifs en parallle


Plusieurs processus concurrents Avec processus en pause lors d'attente de messages

Concurrence

Exemple de flux d'excution pour notre exemple de client/serveur prcdent


temps

45

Sockets TCP gestion plusieurs clients

Particularit cot serveur en TCP

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

Communication avec plusieurs clients pour le serveur

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

Rception de donnes venant d'un client quelconque


Sockets TCP gestion plusieurs clients

Communication avec plusieurs clients (suite)


Contrainte

Lecture sur une socket : opration bloquante

Tant que des donnes ne sont pas reues Jusqu' la prochaine connexion d'un client distant

Attente de connexion : opration bloquante

Avec un seul flot d'excution (processus/thread)

Si ne sait pas quel est l'ordonnancement des arrives des donnes des clients ou de leur connexion au serveur

Impossible grer

Donc ncessit de plusieurs processus ou threads


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

Sockets TCP gestion plusieurs clients

Boucle de fonctionnement gnral d'un serveur pour grer plusieurs clients


while(true) socketClient = acceptConnection() newThread(socketClient) Exemple avec 2 clients ->

48

Vous aimerez peut-être aussi