Beruflich Dokumente
Kultur Dokumente
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
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
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
31
Exemple Serveur
32
Exemple Client
33