SlideShare une entreprise Scribd logo
1  sur  61
Télécharger pour lire hors ligne
Chapitre 4 : Programmation réseau avec
les sockets
1
Hassan El Bahi
www.elbahihassan.com
Plan
1. Introduction
2. Rappel sur les réseaux
3. Introduction aux sockets
4. Sockets TCP
5. Socket UDP
2
Hassan El Bahi
www.elbahihassan.com
Introduction
o Ce cours n’est pas un cours de réseau
- On y détaillera pas de protocoles de bas niveau (mais on en parlera)
o Ce cours est un cours de programmation réseau:
- On y apprend à écrire des applications nécessitant de la communication.
o Pour le programmeur, qu’est-ce qu’un réseau ?
- Un ensemble de services
- Un moyen de communication (ensemble de machines/applications
atteignables)
3
Introduction
o Il existe au moins deux grands modes de communication :
 Par paquet (datagram) : la poste en est un bon exemple :
- Dans ce mode on est pas connecté (encore que), on est juste
atteignable.
 En flux (stream) : la téléphonie en est un bon exemple.
- Dans ce mode on est connecté.
4
Introduction
o Dans le mode paquet :
 Il n’existe pas d’ordre dans la délivrance des paquets.
- un paquet posté en premier peut arriver en dernier.
 Il n’existe pas non plus de fiabilité.
- un paquet envoyé peut être perdu.
o Intérêt : souple et léger…
5
Introduction
o Dans le mode flux:
 Les informations sont reçues dans l’ordre
exact de leur émission.
 Il n’y a pas de perte.
o Inconvénient : nécessite l’établissement d’une connexion et consomme
des ressources
6
Rappel sur les réseaux – Modèle OSI
7
Rappel sur les réseaux – Modèle OSI
8
Rappel sur les réseaux – Modèle OSI
9
Rappel sur les réseaux – Modèle OSI
o Modèle OSI de communication en couches
- Chaque couche a un rôle particulier
- Pour communiquer avec une autre entité, une couche utilise les
services de sa couche locale inférieure
- Une couche d'une entité communique avec une couche de même
niveau d'une autre entité en respectant un certain protocole de
communication
o Données échangées entre 2 couches PDU: trames ou paquets [ou
segments ou messages]
- Structure de données: deux parties: PDU = PCI + SDU
* SDU: Données de la couche supérieure à transmettre
* PCI: Données de contrôle de la communication entre couches
10
Rappel sur les réseaux – Modèle OSI
11
Organisation des unités de données entre les couches N et N+1
Couche N+1
Couche N
Unité de données de protocole
(N+1) PDU (N+1)
Unité de données de service
(N) SDU(N)
Informations de contrôle de
protocole (N) PCI (N)
Unité de données de protocole (N) PDU (N)
Rappel sur les réseaux – Modèle OSI
12
Rappel sur les réseaux – Modèle TCP/IP
13
Rappel sur les réseaux – Modèle TCP/IP
14
Processus d'encapsulation et de désencapsulation
Rappel sur les réseaux – Modèle TCP/IP
15
Rappel sur les réseaux – Modèle TCP/IP
Les deux couches qui nous intéressent seront donc :
 la couche transport :
o TCP (Transmission Control Protocol)
- Connexion virtuelle directe et fiable entre 2 applications
- Orienté connexion, point à point, bidirectionnel, fiable, conserve le
séquencement
o UDP (User Datagram Protocol): mode datagramme :
- Envoi de paquets de données
- Pas de gestion de l'ordre d'arrivée, absence de gestion des paquets
perdus
 la couche application :
o très variée…
16
Rappel sur les réseaux – Modèle TCP/IP
 Le couche transport fournit un ou plusieurs services de communication
entre applications (par exemple TCP ou UDP)
o pour communiquer, ces applications doivent se connaître
- il existe donc un mécanisme de nommage…
 une application fournit un service particulier sur une machine donnée
o le service est identifié par un port
o la machine est identifiée par une adresse
17
Rappel sur les réseaux – Modèle TCP/IP
 un couple (adresse , port) est un point de communication
- toute communication ne peut s’effectuer qu’entre au moins deux
points de communications
o l’émetteur
o le (ou les) receveur(s)
18
Rappel sur les réseaux – Modèle TCP/IP
Une machine peut-être identifiée par :
 un nom Internet (pas strictement nécessaire)
- Exemple : www.google.com
 par une adresse Internet (toute machine connectée au réseau en
possède une)
- En réalité il s’agit de l’adresse d’un dispositif réseau sur une machine
Exemple : 211.45.27.202
19
Rappel sur les réseaux – Modèle TCP/IP
 D’autre part, sur une machine donnée plusieurs communications peuvent
prendre place simultanément
- toute communication nécessite l’utilisation d’un port
 Il existe essentiellement trois types de ports :
- les ports reconnus, de numéro compris entre 0 et 1023
- les ports réservés, de numéro compris entre 1024 et 49151
- les ports libres, de numéro compris entre 49152 et 65535
20
Introduction aux sockets
Définitions :
o Un socket est une pointe de communication ouvert au niveau des
couches réseaux et permettant de faire passer des flux
o La communication est en point à point en mode client/serveur
o La communication est bidirectionnelle
o La connexion se fait en mode connecté (TCP) ou non connecté (UDP)
o Il existe deux protocoles utilisant les sockets en Java :
 TCP : Stream Socket
• Communication en mode connecté
• Les applications sont averties lors de la déconnexion
 UDP : Datagram Socket
• Communication en mode non connecté
• Plus rapide mais moins fiable que TCP
21
Sockets TCP : principe
Fonctionnement en mode connecté :
o Données envoyées dans un « tuyau » et non pas par paquet : Flux de données
o Fiable : la couche TCP assure que:
 Les données envoyées sont toutes reçues par la machine destinataire
 Les données sont reçues dans l'ordre où elles ont été envoyées
22
Sockets TCP : principe
23
Client
Serveur
Crée un socket
demande une connexion
Attend une connexion
Accepte la demande
échange de données
création de socket
échange de données
Fermer connexion
Fermer connexion
Sockets TCP en Java
Classes du package java.net utilisées pour communication via TCP
o InetAddress : codage des adresses IP
o Socket : socket mode connecté
o ServerSocket : socket d'attente de connexion du coté server
24
Sockets TCP en Java
Classe InetAddress
- Constructeurs : Pas de constructeurs, on passe par des méthodes statiques
pour créer un objet
- Méthodes:
o public static InetAddress getByName(String host) throws
UnknownHostException:
- Crée un objet InetAddress identifiant une machine dont le nom est
passé en paramètre
- L'exception est levée si le service de nom (DNS...) du système ne trouve
pas de machine du nom passé en paramètre sur le réseau
25
Sockets TCP en Java
Classe InetAddress
- Méthodes (Suite) :
o 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
o public String getHostName() : Retourne le nom de la machine dont
l'adresse est codée par l'objet InetAddress
26
Sockets TCP en Java
Classe Socket
- Constructeurs :
o public Socket(InetAddress address, int port) throws IOException :
- Crée une socket locale et la connecte à un port distant d'une machine
distante identifié par le couple address/port
o public Socket(String address, int port) throws
IOException,UnknownHostException:
o Idem mais avec nom de la machine au lieu de son adresse IP codée
o Lève l'exception UnknownHostException si le service de nom ne parvient
pas à identifier la machine
27
Sockets TCP en Java
Classe Socket
- Méthodes d'émission/réception de données:
• On récupère les flux d'entrée/sorties associés à la socket
- OutputStream getOutputStream()
- Retourne le flux de sortie permettant d'envoyer des données via la
Socket
- InputStream getInputStream()
- Retourne le flux d'entrée permettant de recevoir des données via la
Socket
- Fermeture d'une socket
- public close()
- Ferme la socket et rompt la connexion avec la machine distante
28
Sockets TCP en Java
Classe Socket
- Méthodes « get »:
- int getPort()
- Renvoie le port distant avec lequel est connecté la socket
- InetAddress getAddress()
- Renvoie l'adresse IP de la machine distante
- int getLocalPort()
- Renvoie le port local sur lequel est liée la socket
29
Sockets TCP en Java
Classe ServerSocket
- Socket d'attente de connexion, coté serveur uniquement
- Constructeurs
- public ServerSocket(int port) throws IOException
- Crée une socket d'écoute (d'attente de connexion de la part de clients)
- La socket est liée au port dont le numéro est passé en paramètre
- L'exception est levée notamment si ce port est déjà lié à une socket
- Méthode :
- 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
30
Sockets TCP Java – exemple coté client
31
// adresse IP du serveur
InetAddress adr = InetAddress.getByName("localhost");
// ouverture de connexion avec le serveur sur le port 7777
Socket socket = new Socket(adr, 7777);
// 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 chaîne dans le flux de sortie : c'est-à-dire
// envoi de données au serveur
output.writeObject("Salut Serveur"));
// attente de réception de données venant du serveur (avec le
// readObject) on sait qu'on attend une chaîne, on peut donc faire
//un cast directement
String chaine = (String)input.readObject();
System.out.println(" reçu du serveur : "+chaine);
Envoi d'une chaîne par le client et réponse sous forme d'une chaîne par le
serveur
Sockets TCP Java – exemple coté serveur
32
// 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 acceptée : récupère 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 données venant du client
String chaine = (String)input.readObject();
System.out.println(" reçu de client : "+chaine);
// affiche les coordonnées du client qui vient de se connecter
System.out.println(" ca vient de : "
+socket.getInetAddress()+":"+socket.getPort());
// envoi d'une réponse au client
output.writeObject("bien recu");
Sockets TCP – gestion plusieurs clients
- On a vu comment faire communiquer des applications 1 à 1 via des sockets
TCP.
- le serveur précédent accepte plusieurs connexions simultanées, mais ne
traite qu’un client à la fois, les autres sont mis en attente.
- Donc nécessité de plusieurs processus ou threads
o Un processus en attente de connexion sur le port d'écoute
o Nouvelle connexion : un nouveau processus est créé pour gérer la
communication avec le nouveau client
33
Sockets TCP – gestion plusieurs clients
Pour créer et lancer un nouveau thread.
- Implémenter l'interface java.lang.Runnable .
oDéfinir la méthode public void run() de cette interface : Qui contient la
séquence de code qu'exécutera la thread.
o Pour lancer le thread :
• Instancier normalement la classe définie
• Créer une instance de la classe Thread en passant cet objet en
paramètre
• Lancer la méthode start() du thread instancié
34
Sockets TCP – gestion plusieurs clients
Thread Java – exemple : Classe CalculFactoriel calcule un factoriel et affiche
le résultat à l'écran.
35
public class CalculFactoriel implements Runnable {
protected int nb;
public CalculFactoriel(int nb) {
this.nb = nb; }
public void run(){
int res = 1;
for (int i=1; i<=nb; i++) {
res = res * i; }
System.out.println(''factoriel de ''+nb+''=''+res);
}
}
Sockets TCP – gestion plusieurs clients
Thread Java – exemple : Lancement du calcul des factoriels de 1 à 10 en
parallèle
36
...
CalculFactoriel cf;
for (int i=10; i >= 1; i--) {
cf = new CalculFactoriel(i);
Thread t = new Thread(cf);
t.start();
}
. ..
On lance un Thread générique qui exécutera la
méthode run() de l'objet de type Runnable
passé en paramètre du constructeur
Résultat de l'exécution
du programme :
factoriel de 10=3628800
factoriel de 9=362880
factoriel de 8=40320
factoriel de 7=5040
factoriel de 6=720
factoriel de 5=120
factoriel de 4=24
factoriel de 3=6
factoriel de 2=2
factoriel de 1=1
Sockets TCP – gestion plusieurs clients
Un serveur TCP/IP multiclients :
37
class Service implements Runnable
{
private Socket s;
Service (Socket _s){
s=_s; }
void run(){
//bla bla bla
s.close();
}
}
....
ServerSocket socketAttente;
socketAttente = new ServerSocket(7777);
while (true) {
Socket socket=socketAttente.accept();
// connexion établie
// la communication est désormais
// possible
Service s=new Service(socket);
Thread t = new Thread(s);
t.start();
}
SocketAttente.close();
....
while (true) {
accepter la connexion d’un nouveau client et
créer une socket service client;
créer un thread pour interagir avec ce client
sur la nouvelle socket service client;
}
Sockets TCP – gestion plusieurs clients
le serveur utilise une classe Service implémentant l’interface Runnable
(thread) pour gérer les échanges de données en tâche de fond. C’est ce
thread qui réalise le service demandé
38
Processus Service
Processus Service
Processus Service
Serveur
Client A
Client B
Client C
Sockets UDP
Mode datagramme
- Envois de paquets de données (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 réseau)
• Un paquet P2 envoyé après un paquet P1 peut arriver avant ce paquet P1
(selon la gestion des routes dans le réseau)
Principe de communication :
- La partie serveur crée une socket et la lie à un port UDP particulier
- La partie client crée une socket pour accéder à la couche UDP et la lie sur
un port quelconque
39
Sockets UDP
Principe de communication (Suite) :
- Le serveur se met en attente de réception de paquet sur sa socket
- Le client envoie un paquet via sa socket en précisant l'adresse du
destinataire
• Couple @IP/port
• Destinataire = partie serveur
 @IP de la machine sur laquelle tourne la partie serveur et numéro
de port sur lequel est liée la socket de la partie serveur
- Le client envoie un paquet via sa socket en précisant l'adresse du
destinataire
- Il est reçu par le serveur (sauf pb réseau)
Si le client envoie un paquet avant que le serveur ne soit prêt à recevoir : le
paquet est perdu
40
Sockets UDP en Java
- Java intègre nativement les fonctionnalités de communication réseau au
dessus de TCP-UDP/IP
• Package java.net
- Classes utilisées pour communication via UDP
• InetAddress : codage des adresses IP
 Même classe que celle décrite dans la partie TCP et usage identique
• DatagramSocket : socket mode non connecté (UDP)
• DatagramPacket : paquet de données envoyé via une socket sans
connexion (UDP)
41
Sockets UDP en Java
Classe DatagramPacket
- Structure des données en mode datagramme
- Constructeurs :
o public DatagramPacket(byte[] buf, int length) :
- Création d'un paquet pour recevoir des données (sous forme d'un
tableau d'octets)
- Les données reçues seront placées dans buf
- length précise la taille max de données à lire
• Ne pas préciser une taille plus grande que celle du tableau
• En général, length = taille de buf
- Variante du constructeur : avec un offset pour ne pas commencer au
début du tableau
42
Sockets UDP en Java
Classe DatagramPacket
- Constructeurs (suite) :
opublic DatagramPacket(byte[] buf, int length, InetAddress address, int
port) :
- Création d'un paquet pour envoyer des données (sous forme d'un
tableau d'octets)
- buf : contient les données à envoyer
- length : longueur des données à envoyer
• Ne pas préciser une taille supérieure à celle de buf
- address : adresse IP de la machine destinataire des données
- port : numéro de port distant (sur la machine destinataire) où envoyer
les données
43
Sockets UDP en Java
Classe DatagramPacket
- Méthodes « get »:
oInetAddress getAddress():
- Si paquet à envoyer : adresse de la machine destinataire
- Si paquet reçu : adresse de la machine qui a envoyé le paquet
oint getPort():
- Si paquet à envoyer : port destinataire sur la machine distante
- Si paquet reçu : port utilisé par le programme distant pour envoyer le
paquet
44
Sockets UDP en Java
Classe DatagramPacket
- Méthodes « get » (Suite) :
obyte[] getData:
- Données contenues dans le paquet
oint getLength():
- Si paquet à envoyer : longueur des données à envoyer
- Si paquet reçu : longueur des données reçues
45
Sockets UDP en Java
Classe DatagramPacket
- Méthodes « set » :
ovoid setAddress(InetAdress adr) :
- Positionne l'adresse IP de la machine destinataire du paquet
ovoid setPort(int port) :
- Positionne le port destinataire du paquet pour la machine distante
ovoid setData(byte[] data):
- Positionne les données à envoyer
oint setLength(int length) :
- Positionne la longueur des données à envoyer
46
Sockets UDP en Java
- Les données circulent sur Internet sous forme de datagrammes (on parle
aussi de paquets ). Les datagrammes sont des données encapsulées, c'est-à-
dire des données auxquelles on a ajouté des en-têtes correspondant à des
informations sur leur transport (telles que l'adresse IP de destination).
- La taille max des données transportées est de (216) ~ 64Ko. Checksum
optionnel en IP v4, obligatoire en IP v6 . Voici ce à quoi ressemble un
datagramme : 4,
47
Sockets UDP en Java
- Un datagramme UDP est rarement envoyé via plusieurs datagrammes IP.
- En pratique : il est conseillé de ne pas dépasser 8 Ko car la plupart des
systèmes limitent à 8 Ko la taille des datagrammes UDP.
- Pour être certain de ne pas perdre de données : 512 octets max
- Si datagramme UDP trop grand : les données sont tronquées
- Si tableau d'octets en réception est plus petit que les données envoyées
les données reçues sont généralement tronquées
48
Sockets UDP en Java
Classe DatagramSocket
- Socket en mode datagramme
- Constructeurs :
o public DatagramSocket() throws SocketException :
- Crée une nouvelle socket en la liant à un port quelconque libre
- Exception levée en cas de problème.
o public DatagramSocket(int port) throws SocketException :
- Crée une nouvelle socket en la liant au port local précisé par le
paramètre port
- Exception levée en cas de problème : notamment quand le port est
déjà occupé
49
Sockets UDP en Java
Classe DatagramSocket
- Méthodes d'émission/réception de paquet :
o public void send(DatagramPacket p) throws IOException :
- Envoie le paquet passé en paramètre. Le destinataire est identifié par
le couple @IP/port précisé dans le paquet
- Exception levée en cas de problème d'entrée/sortie.
50
Sockets UDP en Java
Classe DatagramSocket
- Méthodes d'émission/réception de paquet (Suite) :
opublic void receive(DatagramPacket p) throws IOException :
- Reçoit un paquet de données
- Bloquant tant qu'un paquet n'est pas reçu
- Quand paquet arrive, les attributs de p sont modifiés
- Les données reçues sont copiées dans le tableau passé en paramètre
lors de la création de p et sa longueur est positionnée avec la taille des
données reçues
- Les attributs d'@IP et de port de p contiennent l'@IP et le port de la
socket distante qui a émis le paquet
51
Sockets UDP en Java
Classe DatagramSocket
- Autres méthodes :
opublic void close() :
- Ferme la socket et libère le port à laquelle elle était liée
opublic int getLocalPort() :
- Retourne le port local sur lequel est liée la socket
52
Sockets UDP en Java
Classe DatagramSocket
- Réception de données : via méthode receive :
- Méthode bloquante sans contrainte de temps : peut rester en attente
indéfiniment si aucun paquet n'est jamais reçu
- Possibilité de préciser un délai maximum d'attente:
opublic void setSoTimeout(int timeout) throws SocketException:
- L'appel de la méthode receive sera bloquante pendant au plus timeout
millisecondes
- Une méthode receive se terminera alors de 2 façons :
Elle retourne normalement si un paquet est reçu en moins du
temps positionné par l'appel de setSoTimeout
L'exception SocketTimeoutException est levée pour indiquer que
le délai s'est écoulé avant qu'un paquet ne soit reçu
53
Sockets UDP Java – exemple coté client
54
InetAddress adr;
DatagramPacket packet;
DatagramSocket socket;
// adr contient l'@IP de la partie serveur
adr = InetAddress.getByName("localhost");
// données à envoyer : chaîne de caractères
byte[] data = (new String("Hello Word")).getBytes();
// création du paquet avec les données et en précisant l'adresse du
// serveur (@IP et port sur lequel il écoute : 7777)
packet = new DatagramPacket(data, data.length, adr, 7777);
// création d'une socket, sans la lier à un port particulier
socket = new DatagramSocket();
// envoi du paquet via la socket
socket.send(packet);
Sockets UDP Java – exemple coté serveur
55
DatagramSocket socket;
DatagramPacket packet;
// création d'une socket liée au port 7777
DatagramSocket socket = new DatagramSocket(7777);
// tableau de 15 octets qui contiendra les données reçues
byte[] data = new byte[15];
// création d'un paquet en utilisant le tableau d'octets
packet = new DatagramPacket(data, data.length);
// attente de la réception d'un paquet. Le paquet reçu est placé //
dans packet et ses données dans data.
socket.receive(packet);
// récupération et affichage des données (une chaîne de caractères)
String chaine = new String(packet.getData(), 0, packet.getLength());
System.out.println(" recu : "+chaine);
Sockets UDP en Java – exemple suite
56
System.out.println(" ca vient de : "+packet.getAddress()+":"+
packet.getPort());
// on met une nouvelle donnée dans le paquet
// (qui contient donc le couple @IP/port de la socket coté client)
packet.setData((new String("bien recu")).getBytes());
// on envoie le paquet au client
socket.send(packet);
o La communication se fait souvent dans les 2 sens
• Le serveur doit donc connaître la localisation du client
• Elle est précisée dans le paquet qu'il reçoit du client
o Réponse au client, coté serveur
Sockets UDP en Java – exemple suite
57
// attente paquet envoyé sur la socket du client
socket.receive(packet);
// récupération et affichage de la donnée contenue dans le paquet
String chaine = new String(packet.getData(), 0, packet.getLength());
System.out.println(" recu du serveur : "+chaine);
o Réception réponse du serveur, coté client
Critique sockets UDP
58
o Avantages
• Simple à programmer (et à appréhender)
o Inconvénients
• Pas fiable
• Ne permet d'envoyer que des tableaux de byte
Structure des données échangées
59
Format des données à transmettre
o Très limité a priori : tableaux de byte
• Et attention à la taille réservée : si le récepteur réserve un tableau
trop petit par rapport à celui envoyé, une partie des données est
perdue
o Doit donc pouvoir convertir
• Un objet quelconque en byte[] pour l'envoyer
• Un byte[] en un objet d'un certain type après réception
o Solution
• Utiliser les flux Java pour conversion automatique
Sockets UDP en Java – exemple suite
60
// 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();
Pour émettre et recevoir n'importe quel objet via des sockets UDP
Sockets UDP ou TCP ?
61
Choix entre UDP et TCP
o A priori simple
• TCP est fiable et mieux structuré
o Mais intérêt tout de même pour UDP dans certains cas :
• Si la fiabilité n'est pas essentielle
• Si la connexion entre les 2 applications n'est pas utile
• Exemple :
 Un thermomètre envoie toutes les 5 secondes la température de
l'air ambiant à un afficheur distant
 Pas grave de perdre une mesure de temps en temps
 Pas grave d'envoyer les mesures même si l'afficheur est absent

Contenu connexe

Tendances

Networking Project(FINAL)
Networking Project(FINAL)Networking Project(FINAL)
Networking Project(FINAL)Priyojit Das
 
Python avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionPython avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionECAM Brussels Engineering School
 
Alphorm.com Formation Certification NSE4 - Fortinet Fortigate Infrastructure 6.x
Alphorm.com Formation Certification NSE4 - Fortinet Fortigate Infrastructure 6.xAlphorm.com Formation Certification NSE4 - Fortinet Fortigate Infrastructure 6.x
Alphorm.com Formation Certification NSE4 - Fortinet Fortigate Infrastructure 6.xAlphorm
 
Réseaux et protocoles - Cours + exercices
Réseaux et protocoles - Cours + exercices Réseaux et protocoles - Cours + exercices
Réseaux et protocoles - Cours + exercices sarah Benmerzouk
 
Chapitre 6 - Protocoles TCP/IP, UDP/IP
Chapitre 6  - Protocoles TCP/IP, UDP/IPChapitre 6  - Protocoles TCP/IP, UDP/IP
Chapitre 6 - Protocoles TCP/IP, UDP/IPTarik Zakaria Benmerar
 
Les commandes CISCO (routeur)
Les commandes CISCO (routeur)Les commandes CISCO (routeur)
Les commandes CISCO (routeur)EL AMRI El Hassan
 
Connexion point à point (ppp, hdlc)
Connexion point à point (ppp, hdlc)Connexion point à point (ppp, hdlc)
Connexion point à point (ppp, hdlc)EL AMRI El Hassan
 
Cha4 réseaux
Cha4 réseauxCha4 réseaux
Cha4 réseauxEns Kouba
 
Partie II – ASM Application Security Manager
Partie II – ASM Application Security ManagerPartie II – ASM Application Security Manager
Partie II – ASM Application Security Managere-Xpert Solutions SA
 
Alphorm.com Formation Hacking et Sécurité 2020 (3of4) : Attaques Réseaux, Sys...
Alphorm.com Formation Hacking et Sécurité 2020 (3of4) : Attaques Réseaux, Sys...Alphorm.com Formation Hacking et Sécurité 2020 (3of4) : Attaques Réseaux, Sys...
Alphorm.com Formation Hacking et Sécurité 2020 (3of4) : Attaques Réseaux, Sys...Alphorm
 
Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Heithem Abbes
 
Mise en place d'un wifi securise
Mise en place d'un wifi securiseMise en place d'un wifi securise
Mise en place d'un wifi securiseJUNIOR SORO
 
Généralités sur le routeur
Généralités sur le routeurGénéralités sur le routeur
Généralités sur le routeurStany Mwamba
 
C6 Réseaux : Introduction au routage
C6 Réseaux : Introduction au routageC6 Réseaux : Introduction au routage
C6 Réseaux : Introduction au routagePRONETIS
 

Tendances (20)

Le protocole stp
Le protocole stpLe protocole stp
Le protocole stp
 
Expl couches osi
Expl couches osiExpl couches osi
Expl couches osi
 
Networking Project(FINAL)
Networking Project(FINAL)Networking Project(FINAL)
Networking Project(FINAL)
 
Python avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionPython avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exception
 
Rapport Sockets en Java
Rapport Sockets en JavaRapport Sockets en Java
Rapport Sockets en Java
 
Alphorm.com Formation Certification NSE4 - Fortinet Fortigate Infrastructure 6.x
Alphorm.com Formation Certification NSE4 - Fortinet Fortigate Infrastructure 6.xAlphorm.com Formation Certification NSE4 - Fortinet Fortigate Infrastructure 6.x
Alphorm.com Formation Certification NSE4 - Fortinet Fortigate Infrastructure 6.x
 
Réseaux et protocoles - Cours + exercices
Réseaux et protocoles - Cours + exercices Réseaux et protocoles - Cours + exercices
Réseaux et protocoles - Cours + exercices
 
Chapitre 6 - Protocoles TCP/IP, UDP/IP
Chapitre 6  - Protocoles TCP/IP, UDP/IPChapitre 6  - Protocoles TCP/IP, UDP/IP
Chapitre 6 - Protocoles TCP/IP, UDP/IP
 
Les commandes CISCO (routeur)
Les commandes CISCO (routeur)Les commandes CISCO (routeur)
Les commandes CISCO (routeur)
 
Connexion point à point (ppp, hdlc)
Connexion point à point (ppp, hdlc)Connexion point à point (ppp, hdlc)
Connexion point à point (ppp, hdlc)
 
Openvpn avec un client windows
Openvpn avec un client windows Openvpn avec un client windows
Openvpn avec un client windows
 
Etude de la VoIP
Etude de la VoIPEtude de la VoIP
Etude de la VoIP
 
Cha4 réseaux
Cha4 réseauxCha4 réseaux
Cha4 réseaux
 
Partie II – ASM Application Security Manager
Partie II – ASM Application Security ManagerPartie II – ASM Application Security Manager
Partie II – ASM Application Security Manager
 
Alphorm.com Formation Hacking et Sécurité 2020 (3of4) : Attaques Réseaux, Sys...
Alphorm.com Formation Hacking et Sécurité 2020 (3of4) : Attaques Réseaux, Sys...Alphorm.com Formation Hacking et Sécurité 2020 (3of4) : Attaques Réseaux, Sys...
Alphorm.com Formation Hacking et Sécurité 2020 (3of4) : Attaques Réseaux, Sys...
 
Python avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiersPython avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiers
 
Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Appels de procédures distants (RPC)
Appels de procédures distants (RPC)
 
Mise en place d'un wifi securise
Mise en place d'un wifi securiseMise en place d'un wifi securise
Mise en place d'un wifi securise
 
Généralités sur le routeur
Généralités sur le routeurGénéralités sur le routeur
Généralités sur le routeur
 
C6 Réseaux : Introduction au routage
C6 Réseaux : Introduction au routageC6 Réseaux : Introduction au routage
C6 Réseaux : Introduction au routage
 

Similaire à Chapitre-4-Programmation-réseau-avec-les-sockets.pdf

Similaire à Chapitre-4-Programmation-réseau-avec-les-sockets.pdf (20)

Le Réseau et Java
Le Réseau et JavaLe Réseau et Java
Le Réseau et Java
 
Socket tcp ip client server on langace c
Socket tcp ip client server on langace c Socket tcp ip client server on langace c
Socket tcp ip client server on langace c
 
Les socket ing1_issat
Les socket ing1_issatLes socket ing1_issat
Les socket ing1_issat
 
module_I6_Sockets.pdf
module_I6_Sockets.pdfmodule_I6_Sockets.pdf
module_I6_Sockets.pdf
 
8-socket.pdf
8-socket.pdf8-socket.pdf
8-socket.pdf
 
Les sockets.pptx
Les sockets.pptxLes sockets.pptx
Les sockets.pptx
 
Chap7 java net
Chap7 java netChap7 java net
Chap7 java net
 
Etude de la WIFI sur NS2
Etude de la WIFI sur NS2Etude de la WIFI sur NS2
Etude de la WIFI sur NS2
 
Développement informatique : Programmation réseau
Développement informatique : Programmation réseauDéveloppement informatique : Programmation réseau
Développement informatique : Programmation réseau
 
SdE 11 - Reseau
SdE 11 - ReseauSdE 11 - Reseau
SdE 11 - Reseau
 
SDE 10 - Reseau
SDE 10 - ReseauSDE 10 - Reseau
SDE 10 - Reseau
 
173544 introduction-aux-sockets
173544 introduction-aux-sockets173544 introduction-aux-sockets
173544 introduction-aux-sockets
 
Chapitre 6 - couche transport
Chapitre 6  - couche transportChapitre 6  - couche transport
Chapitre 6 - couche transport
 
6- Javacousesforenginerss_reseaux_v2.pdf
6- Javacousesforenginerss_reseaux_v2.pdf6- Javacousesforenginerss_reseaux_v2.pdf
6- Javacousesforenginerss_reseaux_v2.pdf
 
Cours couche reseau
Cours couche reseauCours couche reseau
Cours couche reseau
 
Chap7_JavaNet.pdf
Chap7_JavaNet.pdfChap7_JavaNet.pdf
Chap7_JavaNet.pdf
 
02 java-socket
02 java-socket02 java-socket
02 java-socket
 
Chapitre 3 Comprendre la notion de socket.docx
Chapitre 3 Comprendre la notion de socket.docxChapitre 3 Comprendre la notion de socket.docx
Chapitre 3 Comprendre la notion de socket.docx
 
Ethical Hacking
Ethical HackingEthical Hacking
Ethical Hacking
 
416769859360_chap2fondementdesreseaux2023.pdf
416769859360_chap2fondementdesreseaux2023.pdf416769859360_chap2fondementdesreseaux2023.pdf
416769859360_chap2fondementdesreseaux2023.pdf
 

Chapitre-4-Programmation-réseau-avec-les-sockets.pdf

  • 1. Chapitre 4 : Programmation réseau avec les sockets 1 Hassan El Bahi www.elbahihassan.com
  • 2. Plan 1. Introduction 2. Rappel sur les réseaux 3. Introduction aux sockets 4. Sockets TCP 5. Socket UDP 2 Hassan El Bahi www.elbahihassan.com
  • 3. Introduction o Ce cours n’est pas un cours de réseau - On y détaillera pas de protocoles de bas niveau (mais on en parlera) o Ce cours est un cours de programmation réseau: - On y apprend à écrire des applications nécessitant de la communication. o Pour le programmeur, qu’est-ce qu’un réseau ? - Un ensemble de services - Un moyen de communication (ensemble de machines/applications atteignables) 3
  • 4. Introduction o Il existe au moins deux grands modes de communication :  Par paquet (datagram) : la poste en est un bon exemple : - Dans ce mode on est pas connecté (encore que), on est juste atteignable.  En flux (stream) : la téléphonie en est un bon exemple. - Dans ce mode on est connecté. 4
  • 5. Introduction o Dans le mode paquet :  Il n’existe pas d’ordre dans la délivrance des paquets. - un paquet posté en premier peut arriver en dernier.  Il n’existe pas non plus de fiabilité. - un paquet envoyé peut être perdu. o Intérêt : souple et léger… 5
  • 6. Introduction o Dans le mode flux:  Les informations sont reçues dans l’ordre exact de leur émission.  Il n’y a pas de perte. o Inconvénient : nécessite l’établissement d’une connexion et consomme des ressources 6
  • 7. Rappel sur les réseaux – Modèle OSI 7
  • 8. Rappel sur les réseaux – Modèle OSI 8
  • 9. Rappel sur les réseaux – Modèle OSI 9
  • 10. Rappel sur les réseaux – Modèle OSI o Modèle OSI de communication en couches - Chaque couche a un rôle particulier - Pour communiquer avec une autre entité, une couche utilise les services de sa couche locale inférieure - Une couche d'une entité communique avec une couche de même niveau d'une autre entité en respectant un certain protocole de communication o Données échangées entre 2 couches PDU: trames ou paquets [ou segments ou messages] - Structure de données: deux parties: PDU = PCI + SDU * SDU: Données de la couche supérieure à transmettre * PCI: Données de contrôle de la communication entre couches 10
  • 11. Rappel sur les réseaux – Modèle OSI 11 Organisation des unités de données entre les couches N et N+1 Couche N+1 Couche N Unité de données de protocole (N+1) PDU (N+1) Unité de données de service (N) SDU(N) Informations de contrôle de protocole (N) PCI (N) Unité de données de protocole (N) PDU (N)
  • 12. Rappel sur les réseaux – Modèle OSI 12
  • 13. Rappel sur les réseaux – Modèle TCP/IP 13
  • 14. Rappel sur les réseaux – Modèle TCP/IP 14 Processus d'encapsulation et de désencapsulation
  • 15. Rappel sur les réseaux – Modèle TCP/IP 15
  • 16. Rappel sur les réseaux – Modèle TCP/IP Les deux couches qui nous intéressent seront donc :  la couche transport : o TCP (Transmission Control Protocol) - Connexion virtuelle directe et fiable entre 2 applications - Orienté connexion, point à point, bidirectionnel, fiable, conserve le séquencement o UDP (User Datagram Protocol): mode datagramme : - Envoi de paquets de données - Pas de gestion de l'ordre d'arrivée, absence de gestion des paquets perdus  la couche application : o très variée… 16
  • 17. Rappel sur les réseaux – Modèle TCP/IP  Le couche transport fournit un ou plusieurs services de communication entre applications (par exemple TCP ou UDP) o pour communiquer, ces applications doivent se connaître - il existe donc un mécanisme de nommage…  une application fournit un service particulier sur une machine donnée o le service est identifié par un port o la machine est identifiée par une adresse 17
  • 18. Rappel sur les réseaux – Modèle TCP/IP  un couple (adresse , port) est un point de communication - toute communication ne peut s’effectuer qu’entre au moins deux points de communications o l’émetteur o le (ou les) receveur(s) 18
  • 19. Rappel sur les réseaux – Modèle TCP/IP Une machine peut-être identifiée par :  un nom Internet (pas strictement nécessaire) - Exemple : www.google.com  par une adresse Internet (toute machine connectée au réseau en possède une) - En réalité il s’agit de l’adresse d’un dispositif réseau sur une machine Exemple : 211.45.27.202 19
  • 20. Rappel sur les réseaux – Modèle TCP/IP  D’autre part, sur une machine donnée plusieurs communications peuvent prendre place simultanément - toute communication nécessite l’utilisation d’un port  Il existe essentiellement trois types de ports : - les ports reconnus, de numéro compris entre 0 et 1023 - les ports réservés, de numéro compris entre 1024 et 49151 - les ports libres, de numéro compris entre 49152 et 65535 20
  • 21. Introduction aux sockets Définitions : o Un socket est une pointe de communication ouvert au niveau des couches réseaux et permettant de faire passer des flux o La communication est en point à point en mode client/serveur o La communication est bidirectionnelle o La connexion se fait en mode connecté (TCP) ou non connecté (UDP) o Il existe deux protocoles utilisant les sockets en Java :  TCP : Stream Socket • Communication en mode connecté • Les applications sont averties lors de la déconnexion  UDP : Datagram Socket • Communication en mode non connecté • Plus rapide mais moins fiable que TCP 21
  • 22. Sockets TCP : principe Fonctionnement en mode connecté : o Données envoyées dans un « tuyau » et non pas par paquet : Flux de données o Fiable : la couche TCP assure que:  Les données envoyées sont toutes reçues par la machine destinataire  Les données sont reçues dans l'ordre où elles ont été envoyées 22
  • 23. Sockets TCP : principe 23 Client Serveur Crée un socket demande une connexion Attend une connexion Accepte la demande échange de données création de socket échange de données Fermer connexion Fermer connexion
  • 24. Sockets TCP en Java Classes du package java.net utilisées pour communication via TCP o InetAddress : codage des adresses IP o Socket : socket mode connecté o ServerSocket : socket d'attente de connexion du coté server 24
  • 25. Sockets TCP en Java Classe InetAddress - Constructeurs : Pas de constructeurs, on passe par des méthodes statiques pour créer un objet - Méthodes: o public static InetAddress getByName(String host) throws UnknownHostException: - Crée un objet InetAddress identifiant une machine dont le nom est passé en paramètre - L'exception est levée si le service de nom (DNS...) du système ne trouve pas de machine du nom passé en paramètre sur le réseau 25
  • 26. Sockets TCP en Java Classe InetAddress - Méthodes (Suite) : o 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 o public String getHostName() : Retourne le nom de la machine dont l'adresse est codée par l'objet InetAddress 26
  • 27. Sockets TCP en Java Classe Socket - Constructeurs : o public Socket(InetAddress address, int port) throws IOException : - Crée une socket locale et la connecte à un port distant d'une machine distante identifié par le couple address/port o public Socket(String address, int port) throws IOException,UnknownHostException: o Idem mais avec nom de la machine au lieu de son adresse IP codée o Lève l'exception UnknownHostException si le service de nom ne parvient pas à identifier la machine 27
  • 28. Sockets TCP en Java Classe Socket - Méthodes d'émission/réception de données: • On récupère les flux d'entrée/sorties associés à la socket - OutputStream getOutputStream() - Retourne le flux de sortie permettant d'envoyer des données via la Socket - InputStream getInputStream() - Retourne le flux d'entrée permettant de recevoir des données via la Socket - Fermeture d'une socket - public close() - Ferme la socket et rompt la connexion avec la machine distante 28
  • 29. Sockets TCP en Java Classe Socket - Méthodes « get »: - int getPort() - Renvoie le port distant avec lequel est connecté la socket - InetAddress getAddress() - Renvoie l'adresse IP de la machine distante - int getLocalPort() - Renvoie le port local sur lequel est liée la socket 29
  • 30. Sockets TCP en Java Classe ServerSocket - Socket d'attente de connexion, coté serveur uniquement - Constructeurs - public ServerSocket(int port) throws IOException - Crée une socket d'écoute (d'attente de connexion de la part de clients) - La socket est liée au port dont le numéro est passé en paramètre - L'exception est levée notamment si ce port est déjà lié à une socket - Méthode : - 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 30
  • 31. Sockets TCP Java – exemple coté client 31 // adresse IP du serveur InetAddress adr = InetAddress.getByName("localhost"); // ouverture de connexion avec le serveur sur le port 7777 Socket socket = new Socket(adr, 7777); // 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 chaîne dans le flux de sortie : c'est-à-dire // envoi de données au serveur output.writeObject("Salut Serveur")); // attente de réception de données venant du serveur (avec le // readObject) on sait qu'on attend une chaîne, on peut donc faire //un cast directement String chaine = (String)input.readObject(); System.out.println(" reçu du serveur : "+chaine); Envoi d'une chaîne par le client et réponse sous forme d'une chaîne par le serveur
  • 32. Sockets TCP Java – exemple coté serveur 32 // 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 acceptée : récupère 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 données venant du client String chaine = (String)input.readObject(); System.out.println(" reçu de client : "+chaine); // affiche les coordonnées du client qui vient de se connecter System.out.println(" ca vient de : " +socket.getInetAddress()+":"+socket.getPort()); // envoi d'une réponse au client output.writeObject("bien recu");
  • 33. Sockets TCP – gestion plusieurs clients - On a vu comment faire communiquer des applications 1 à 1 via des sockets TCP. - le serveur précédent accepte plusieurs connexions simultanées, mais ne traite qu’un client à la fois, les autres sont mis en attente. - Donc nécessité de plusieurs processus ou threads o Un processus en attente de connexion sur le port d'écoute o Nouvelle connexion : un nouveau processus est créé pour gérer la communication avec le nouveau client 33
  • 34. Sockets TCP – gestion plusieurs clients Pour créer et lancer un nouveau thread. - Implémenter l'interface java.lang.Runnable . oDéfinir la méthode public void run() de cette interface : Qui contient la séquence de code qu'exécutera la thread. o Pour lancer le thread : • Instancier normalement la classe définie • Créer une instance de la classe Thread en passant cet objet en paramètre • Lancer la méthode start() du thread instancié 34
  • 35. Sockets TCP – gestion plusieurs clients Thread Java – exemple : Classe CalculFactoriel calcule un factoriel et affiche le résultat à l'écran. 35 public class CalculFactoriel implements Runnable { protected int nb; public CalculFactoriel(int nb) { this.nb = nb; } public void run(){ int res = 1; for (int i=1; i<=nb; i++) { res = res * i; } System.out.println(''factoriel de ''+nb+''=''+res); } }
  • 36. Sockets TCP – gestion plusieurs clients Thread Java – exemple : Lancement du calcul des factoriels de 1 à 10 en parallèle 36 ... CalculFactoriel cf; for (int i=10; i >= 1; i--) { cf = new CalculFactoriel(i); Thread t = new Thread(cf); t.start(); } . .. On lance un Thread générique qui exécutera la méthode run() de l'objet de type Runnable passé en paramètre du constructeur Résultat de l'exécution du programme : factoriel de 10=3628800 factoriel de 9=362880 factoriel de 8=40320 factoriel de 7=5040 factoriel de 6=720 factoriel de 5=120 factoriel de 4=24 factoriel de 3=6 factoriel de 2=2 factoriel de 1=1
  • 37. Sockets TCP – gestion plusieurs clients Un serveur TCP/IP multiclients : 37 class Service implements Runnable { private Socket s; Service (Socket _s){ s=_s; } void run(){ //bla bla bla s.close(); } } .... ServerSocket socketAttente; socketAttente = new ServerSocket(7777); while (true) { Socket socket=socketAttente.accept(); // connexion établie // la communication est désormais // possible Service s=new Service(socket); Thread t = new Thread(s); t.start(); } SocketAttente.close(); .... while (true) { accepter la connexion d’un nouveau client et créer une socket service client; créer un thread pour interagir avec ce client sur la nouvelle socket service client; }
  • 38. Sockets TCP – gestion plusieurs clients le serveur utilise une classe Service implémentant l’interface Runnable (thread) pour gérer les échanges de données en tâche de fond. C’est ce thread qui réalise le service demandé 38 Processus Service Processus Service Processus Service Serveur Client A Client B Client C
  • 39. Sockets UDP Mode datagramme - Envois de paquets de données (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 réseau) • Un paquet P2 envoyé après un paquet P1 peut arriver avant ce paquet P1 (selon la gestion des routes dans le réseau) Principe de communication : - La partie serveur crée une socket et la lie à un port UDP particulier - La partie client crée une socket pour accéder à la couche UDP et la lie sur un port quelconque 39
  • 40. Sockets UDP Principe de communication (Suite) : - Le serveur se met en attente de réception de paquet sur sa socket - Le client envoie un paquet via sa socket en précisant l'adresse du destinataire • Couple @IP/port • Destinataire = partie serveur  @IP de la machine sur laquelle tourne la partie serveur et numéro de port sur lequel est liée la socket de la partie serveur - Le client envoie un paquet via sa socket en précisant l'adresse du destinataire - Il est reçu par le serveur (sauf pb réseau) Si le client envoie un paquet avant que le serveur ne soit prêt à recevoir : le paquet est perdu 40
  • 41. Sockets UDP en Java - Java intègre nativement les fonctionnalités de communication réseau au dessus de TCP-UDP/IP • Package java.net - Classes utilisées pour communication via UDP • InetAddress : codage des adresses IP  Même classe que celle décrite dans la partie TCP et usage identique • DatagramSocket : socket mode non connecté (UDP) • DatagramPacket : paquet de données envoyé via une socket sans connexion (UDP) 41
  • 42. Sockets UDP en Java Classe DatagramPacket - Structure des données en mode datagramme - Constructeurs : o public DatagramPacket(byte[] buf, int length) : - Création d'un paquet pour recevoir des données (sous forme d'un tableau d'octets) - Les données reçues seront placées dans buf - length précise la taille max de données à lire • Ne pas préciser une taille plus grande que celle du tableau • En général, length = taille de buf - Variante du constructeur : avec un offset pour ne pas commencer au début du tableau 42
  • 43. Sockets UDP en Java Classe DatagramPacket - Constructeurs (suite) : opublic DatagramPacket(byte[] buf, int length, InetAddress address, int port) : - Création d'un paquet pour envoyer des données (sous forme d'un tableau d'octets) - buf : contient les données à envoyer - length : longueur des données à envoyer • Ne pas préciser une taille supérieure à celle de buf - address : adresse IP de la machine destinataire des données - port : numéro de port distant (sur la machine destinataire) où envoyer les données 43
  • 44. Sockets UDP en Java Classe DatagramPacket - Méthodes « get »: oInetAddress getAddress(): - Si paquet à envoyer : adresse de la machine destinataire - Si paquet reçu : adresse de la machine qui a envoyé le paquet oint getPort(): - Si paquet à envoyer : port destinataire sur la machine distante - Si paquet reçu : port utilisé par le programme distant pour envoyer le paquet 44
  • 45. Sockets UDP en Java Classe DatagramPacket - Méthodes « get » (Suite) : obyte[] getData: - Données contenues dans le paquet oint getLength(): - Si paquet à envoyer : longueur des données à envoyer - Si paquet reçu : longueur des données reçues 45
  • 46. Sockets UDP en Java Classe DatagramPacket - Méthodes « set » : ovoid setAddress(InetAdress adr) : - Positionne l'adresse IP de la machine destinataire du paquet ovoid setPort(int port) : - Positionne le port destinataire du paquet pour la machine distante ovoid setData(byte[] data): - Positionne les données à envoyer oint setLength(int length) : - Positionne la longueur des données à envoyer 46
  • 47. Sockets UDP en Java - Les données circulent sur Internet sous forme de datagrammes (on parle aussi de paquets ). Les datagrammes sont des données encapsulées, c'est-à- dire des données auxquelles on a ajouté des en-têtes correspondant à des informations sur leur transport (telles que l'adresse IP de destination). - La taille max des données transportées est de (216) ~ 64Ko. Checksum optionnel en IP v4, obligatoire en IP v6 . Voici ce à quoi ressemble un datagramme : 4, 47
  • 48. Sockets UDP en Java - Un datagramme UDP est rarement envoyé via plusieurs datagrammes IP. - En pratique : il est conseillé de ne pas dépasser 8 Ko car la plupart des systèmes limitent à 8 Ko la taille des datagrammes UDP. - Pour être certain de ne pas perdre de données : 512 octets max - Si datagramme UDP trop grand : les données sont tronquées - Si tableau d'octets en réception est plus petit que les données envoyées les données reçues sont généralement tronquées 48
  • 49. Sockets UDP en Java Classe DatagramSocket - Socket en mode datagramme - Constructeurs : o public DatagramSocket() throws SocketException : - Crée une nouvelle socket en la liant à un port quelconque libre - Exception levée en cas de problème. o public DatagramSocket(int port) throws SocketException : - Crée une nouvelle socket en la liant au port local précisé par le paramètre port - Exception levée en cas de problème : notamment quand le port est déjà occupé 49
  • 50. Sockets UDP en Java Classe DatagramSocket - Méthodes d'émission/réception de paquet : o public void send(DatagramPacket p) throws IOException : - Envoie le paquet passé en paramètre. Le destinataire est identifié par le couple @IP/port précisé dans le paquet - Exception levée en cas de problème d'entrée/sortie. 50
  • 51. Sockets UDP en Java Classe DatagramSocket - Méthodes d'émission/réception de paquet (Suite) : opublic void receive(DatagramPacket p) throws IOException : - Reçoit un paquet de données - Bloquant tant qu'un paquet n'est pas reçu - Quand paquet arrive, les attributs de p sont modifiés - Les données reçues sont copiées dans le tableau passé en paramètre lors de la création de p et sa longueur est positionnée avec la taille des données reçues - Les attributs d'@IP et de port de p contiennent l'@IP et le port de la socket distante qui a émis le paquet 51
  • 52. Sockets UDP en Java Classe DatagramSocket - Autres méthodes : opublic void close() : - Ferme la socket et libère le port à laquelle elle était liée opublic int getLocalPort() : - Retourne le port local sur lequel est liée la socket 52
  • 53. Sockets UDP en Java Classe DatagramSocket - Réception de données : via méthode receive : - Méthode bloquante sans contrainte de temps : peut rester en attente indéfiniment si aucun paquet n'est jamais reçu - Possibilité de préciser un délai maximum d'attente: opublic void setSoTimeout(int timeout) throws SocketException: - L'appel de la méthode receive sera bloquante pendant au plus timeout millisecondes - Une méthode receive se terminera alors de 2 façons : Elle retourne normalement si un paquet est reçu en moins du temps positionné par l'appel de setSoTimeout L'exception SocketTimeoutException est levée pour indiquer que le délai s'est écoulé avant qu'un paquet ne soit reçu 53
  • 54. Sockets UDP Java – exemple coté client 54 InetAddress adr; DatagramPacket packet; DatagramSocket socket; // adr contient l'@IP de la partie serveur adr = InetAddress.getByName("localhost"); // données à envoyer : chaîne de caractères byte[] data = (new String("Hello Word")).getBytes(); // création du paquet avec les données et en précisant l'adresse du // serveur (@IP et port sur lequel il écoute : 7777) packet = new DatagramPacket(data, data.length, adr, 7777); // création d'une socket, sans la lier à un port particulier socket = new DatagramSocket(); // envoi du paquet via la socket socket.send(packet);
  • 55. Sockets UDP Java – exemple coté serveur 55 DatagramSocket socket; DatagramPacket packet; // création d'une socket liée au port 7777 DatagramSocket socket = new DatagramSocket(7777); // tableau de 15 octets qui contiendra les données reçues byte[] data = new byte[15]; // création d'un paquet en utilisant le tableau d'octets packet = new DatagramPacket(data, data.length); // attente de la réception d'un paquet. Le paquet reçu est placé // dans packet et ses données dans data. socket.receive(packet); // récupération et affichage des données (une chaîne de caractères) String chaine = new String(packet.getData(), 0, packet.getLength()); System.out.println(" recu : "+chaine);
  • 56. Sockets UDP en Java – exemple suite 56 System.out.println(" ca vient de : "+packet.getAddress()+":"+ packet.getPort()); // on met une nouvelle donnée dans le paquet // (qui contient donc le couple @IP/port de la socket coté client) packet.setData((new String("bien recu")).getBytes()); // on envoie le paquet au client socket.send(packet); o La communication se fait souvent dans les 2 sens • Le serveur doit donc connaître la localisation du client • Elle est précisée dans le paquet qu'il reçoit du client o Réponse au client, coté serveur
  • 57. Sockets UDP en Java – exemple suite 57 // attente paquet envoyé sur la socket du client socket.receive(packet); // récupération et affichage de la donnée contenue dans le paquet String chaine = new String(packet.getData(), 0, packet.getLength()); System.out.println(" recu du serveur : "+chaine); o Réception réponse du serveur, coté client
  • 58. Critique sockets UDP 58 o Avantages • Simple à programmer (et à appréhender) o Inconvénients • Pas fiable • Ne permet d'envoyer que des tableaux de byte
  • 59. Structure des données échangées 59 Format des données à transmettre o Très limité a priori : tableaux de byte • Et attention à la taille réservée : si le récepteur réserve un tableau trop petit par rapport à celui envoyé, une partie des données est perdue o Doit donc pouvoir convertir • Un objet quelconque en byte[] pour l'envoyer • Un byte[] en un objet d'un certain type après réception o Solution • Utiliser les flux Java pour conversion automatique
  • 60. Sockets UDP en Java – exemple suite 60 // 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(); Pour émettre et recevoir n'importe quel objet via des sockets UDP
  • 61. Sockets UDP ou TCP ? 61 Choix entre UDP et TCP o A priori simple • TCP est fiable et mieux structuré o Mais intérêt tout de même pour UDP dans certains cas : • Si la fiabilité n'est pas essentielle • Si la connexion entre les 2 applications n'est pas utile • Exemple :  Un thermomètre envoie toutes les 5 secondes la température de l'air ambiant à un afficheur distant  Pas grave de perdre une mesure de temps en temps  Pas grave d'envoyer les mesures même si l'afficheur est absent