Vous êtes sur la page 1sur 33

Informatique Repartie

Chapitre 2 : Les sockets


Cecilia Zanni-Merk
cecilia.zanni-merk@insa-rouen.fr
Bureau BO B R1 04

Basé sur le cours de M Alexandre Pauchet, INSA Rouen Normandie, 2016


Planning prévisionnel au 29 janvier 2018
• 22/1: CM + CM (présentation + intro + client/serveur)
• 29/1 : CM Sockets + TDM Sockets
• 5/2: CM (Conception / RPC) + mini-projets sockets
• 12/2: CM RMI + TDM RMI
• 19/2 : CM RMI + TDM RMI (mini-soutenances mini-projets sockets)
VACANCES FEVRIER
• 12/3 : mini-projets RMI (on commence à 9h45, présence obligatoire les deux créneaux)
• 19/3 : CM SOAP + TDM SOAP
• 26/3 : CM SOAP + TDM SOAP (mini-soutenances mini-projets RMI)
• 5/4: CM REST + mini-projet SOAP (C’est un jeudi, on commence à 13h15)
• 9/4: CM REST + TDM REST
• 16/4: TDM REST (mini-soutenances mini-projets SOAP) + mini-projet REST
VACANCES AVRIL
• 14/5: TDM (mini-soutenances mini-projets REST) + soutenances conception (présence obligatoire à partir de
9h45)
Références
• Le cours de M Pauchet sur Moodle
• Architectures réparties en Java de Annick Fron
ISBN 9782100738700. Ed Dunod
• Le cours « Introduction aux réseaux » d’Olivier Dalle, Université de
Nice (Sophia-Antipolis)
http://deptinfo.unice.fr/~dalle/wiki/uploads/Enseignements/7-SYS-L2.pdf

3
Définition
• Un socket est un port de communication ouvert permettant de faire
passer des flux
• C'est une interface entre la couche transport et les couches
applicatives du modèle OSI
• La communication est
• en point à point en mode client-serveur,
• bi-directionnelle,
• en mode connecté (TCP) ou non connecté (UDP)

4
Communication point à point bidirectionnelle
• Un socket désigne l'extrémité d'une connexion
• Un socket est associé à un port
• La connexion établie, la communication est similaire à une écriture de
fichier

5
Modes de connexion
• Mode connecté (TCP) : une
liaison préalable aux
données est établie
• Mode non connecté (UDP) :
aucune liaison initiale n'est
établie, chaque message est
envoyé individuellement

6
Mode connecté vs Mode non connecté
• Mode connecté (TCP)
• Fiable, car il nécessite un point de rendez-vous entre le client et le serveur au
moment de la connexion du client. On est assuré que les deux parties sont
présentes au moment de la communication
• Séquencement des messages
• Mode non connecté (UDP)
• Pas de connexion à établir entre le client et le serveur.
• Pas de point de rendez-vous  le serveur n’est pas assuré que l’information a
été reçue réellement
• Rapide

7
Sockets en Java

8
Le package java.net

9
La classe InetAddress
• Représente les adresses IP
• Encapsule l'accès au serveur de noms DNS
• Pas de constructeur  besoin d’utiliser les méthodes de classe :
public static InetAddress getLocalHost() throws
UnknownHostException
public static InetAddress getByName(String host) throws
UnknownHostException
public static InetAddress[] getAllByName(String host) throws
UnknownHostException

10
Un exemple

L'adresse locale est : DESKTOP-4G9I5C8/192.168.0.27


L'adresse du serveur Web de l'Ecole est : www.insa-rouen.fr/193.49.10.35
11
La classe Socket
• Sockets de flux (client et serveur)
• Méthodes de base :
public Socket(String host, int port) throws UnknownHostException,
IOException
public Socket(InetAddress address, int port) throws IOException
public InetAddress getInetAddress() // adresse IP distante
public InetAddress getLocalAddress() // adresse IP locale
public int getPort() // port distant
public int getLocalPort() // port local
public InputStream getInputStream() throws IOException
public OutputStream getOutputStream() throws IOException
void close()
12
Sockets en mode connecté
• Communication en mode connecté
• Client/serveur via une interface par socket
• Constructeur :
public ServerSocket(int port, int nbr_max_conn, InetAddress
adresse_locale) throws IOException
• Acceptation d'une connexion client (bloquant)
public Socket accept() throws IOException

13
Fonctionnement de base

14
Exemple de Serveur

15
Exemple de Client

16
Echange de messages
• Une fois la connexion établie et les sockets en possession, il est
possible de récupérer le flux d'entrée et de sortie de la connexion TCP
vers le serveur. Il existe deux méthodes pour permettre la
récupération des flux :
• getInputStream() de la classe InputStream. Elle nous permet de
gérer les flux entrants
• getOutputStream() de la classe OuputStream. Elle nous permet de
gérer les flux sortants
• En général les types d'entrée et sortie utilisés sont
• BufferedReader et InputStreamReader pour la lecture,
• PrintWriter pour l'écriture.
17
Exemple de Serveur

18
Exemple de Client

19
Quelques commentaires
• C’est une bonne pratique de fermer les sockets, qui sont des
ressources systèmes en nombre limité.
• En particulier, le socket serveur, sinon il est impossible de relancer le
serveur sans obtenir une exception du type Address already
in use
• Les rôles de socket1 sur le serveur et de socket2 sur le client
sont, une fois la connexion établie absolument symétriques, ce qui
permettrait de nouer un dialogue

20
Connexion de plusieurs clients
• Dans l’exemple précédent, le serveur sert un seul client et puis
s’arrête. 
• Pour permettre des connexions successives de plusieurs clients, une
première idée serait de boucler en séquence sur les accept

boolean estActif;
while (estActif) socket1 = serverSocket.accept()
// … traitement de la requête

21
Utilisation de threads dans un serveur
• Le principe d'utilisation des Threads est simple
• Après avoir créer un objet ServerSocket par le serveur, on place
l’objet comme paramètre d’un constructeur de la classe qui
implémente la classe Runnable ou qui étend la classe Thread.
• Dès qu'un client souhaite se connecter avec le serveur, un Thread
s'occupe de la connexion. On ne fait plus appel au serveur quand un
client souhaite se connecter, c’est un Thread qui s’en occupera.

22
Un exemple de Serveur

23
Exemple (continuation)

24
Sockets en mode non connecté
• Mode UDP, qui va permettre une meilleure performance; mais une
perte de fiabilité, car on ne teste pas la présence des émetteurs et
récepteurs comme lors de la connexion en TCP
• Ce protocole nécessite la segmentation de l’information en paquets
• UDP est utilisé essentiellement pour des transferts de données
numériques
• Il s’agit d’un protocole point à point, il est possible d’effectuer du
multicast pour permettre la diffusion vers plusieurs récepteurs

25
Fonctionnement

26
La classe DatagramSocket
Méthodes de base
public DatagramSocket() throws SocketException
public DatagramSocket(int port) throws SocketException
public DatagramSocket(int port, InetAddress addr) throws
SocketException
void close()
public void send(DatagramPacket p) throws IOException
public void receive(DatagramPacket p) throws IOException

27
La classe DatagramPacket
Méthodes de base
DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
InetAddress getAddress()
byte[] getData()
int getLength()
int getPort()
void setAddress(InetAddress iaddr)
void setData(byte[] buf)
void setLength(int length)
void setPort(int iport)
28
Exemple d’un Serveur

Le serveur doit utiliser une adresse spécifique pour envoyer son


datagramme. Il la récupère dans le message qu’il reçoit. Le client se
voit allouer en effet un numéro de port de manière dynamique.

29
Exemple d’un Client

30
Multicast
• Côté serveur, le code est identique que le précédent, mais l’adresse
est cette fois une adresse multicast : on ignore quels destinataires
recevront ce message

• Sur le client, on utilise joinGroup, puisque le client va se joindre à


un groupe en écoute sur l’adresse multicast. On utilisera également la
classe MulticastSocket

31
Exemple Serveur

32
Exemple Client

33