srcs : la programmation réseau en java. - version 15

12
SRCS : La programmation réseau en Java. Version 15.01 Julien Sopena 1 1 [email protected] Équipe REGAL - INRIA Rocquencourt LIP6 - Université Pierre et Marie Curie Master SAR 1ère année - SRCS - 2016/2017 J. Sopena (INRIA/UPMC) La programmation réseau en Java. 1 / 16 Grandes lignes du cours Une abstraction des protocoles réseau Gestion des addresses réseau en Java Le sockets TCP Le sockets UDP J. Sopena (INRIA/UPMC) La programmation réseau en Java. 2 / 16 Outline Une abstraction des protocoles réseau Gestion des addresses réseau en Java Le sockets TCP Le sockets UDP J. Sopena (INRIA/UPMC) La programmation réseau en Java. 3 / 16 Quel niveau d’abstraction pour le réseau ? Les 7 couches du modèle OSI Couche 7 - Applicative : Les logiciels (ex : NFS) Couche 6 - Présentation : Représentation des données (ex : XDR) Couche 5 - Session : Établissement et maintient des sessions (ex : RPC) Couche 4 - Transport : Liaison de bout en bout (ex : UDP, TCP, ...) Couche 3 - Réseau : Adressage et routage entre machines (ex : IP) Couche 2 - Liaison : Gestion des envois point à point (ex : Ethernet) Couche 1 - Physique : Support de transmission J. Sopena (INRIA/UPMC) La programmation réseau en Java. 4 / 16 Quel niveau d’abstraction pour le réseau ? Les 7 couches du modèle OSI Couche 7 - Applicative : Les logiciels (ex : NFS) Couche 6 - Présentation : Représentation des données (ex : XDR) Couche 5 - Session : Établissement et maintient des sessions (ex : RPC) Couche 4 - Transport : Liaison de bout en bout (ex : UDP, TCP, ...) Couche 3 - Réseau : Adressage et routage entre machines (ex : IP) Couche 2 - Liaison : Gestion des envois point à point (ex : Ethernet) Couche 1 - Physique : Support de transmission Les Sockets Java offrent une abstraction du réseau au niveau des couches Transport (4) et Réseau (3). Java introduit donc différentes classes correspondant aux protocoles abstraits : TCP ou UDP. J. Sopena (INRIA/UPMC) La programmation réseau en Java. 4 / 16 La notion de mode de connecté Définition En mode connecté, la communication entre un client et un serveur est pré- cédée d’une connexion et suivie d’une fermeture : I Facilite la gestion d’état I Meilleurs contrôle des arrivées/départs de clients I Uniquement communication unicast I Plus lent au démarrage Définition En mode non connecté, les messages sont envoyés librement : I Plus facile à mettre en œuvre I Plus rapide au démarrage J. Sopena (INRIA/UPMC) La programmation réseau en Java. 5 / 16 Les protocoles TCP et UDP TCP : une communication de type téléphone I Mode connecté : protocole de prise de connexion (lent) I Sans perte : un message arrive au moins un fois I Sans duplication : un message arrive au plus une fois I Avec fragmentation : les messages peuvent être coupés I Ordre respecté : messages délivrés dans l’ordre d’émission UDP : une communication de type courrier I Mode non connecté : pas de protocole de connexion (plus rapide) I Avec perte : l’émetteur n’est pas assuré de la délivrance I Avec duplication : un message peut arriver plus d’une fois I Sans fragmentation : les messages envoyés ne sont jamais coupés = soit un message arrive entièrement, soit il n’arrive pas I Ordre non respecté : messages délivrés dans l’ordre d’arrivé J. Sopena (INRIA/UPMC) La programmation réseau en Java. 6 / 16 La notion de mode de connecté Attention Il ne faut pas confondre connexion au niveau transport et connexion au niveau applicatif : I FTP fonctionne en connecté en utilisant TCP I DNS fonctionne en non-connecté en utilisant UDP I HTTP fonctionne en non-connecté en utilisant TCP J. Sopena (INRIA/UPMC) La programmation réseau en Java. 7 / 16

Upload: others

Post on 23-Jul-2022

4 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: SRCS : La programmation réseau en Java. - Version 15

SRCS :La programmation réseau en Java.

Version 15.01

Julien Sopena1

[email protected]Équipe REGAL - INRIA RocquencourtLIP6 - Université Pierre et Marie Curie

Master SAR 1ère année - SRCS - 2016/2017

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 1 / 16

Grandes lignes du cours

Une abstraction des protocoles réseauGestion des addresses réseau en JavaLe sockets TCPLe sockets UDP

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 2 / 16

Outline

Une abstraction des protocoles réseauGestion des addresses réseau en JavaLe sockets TCPLe sockets UDP

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 3 / 16

Quel niveau d’abstraction pour le réseau ?

Les 7 couches du modèle OSI

Couche 7 - Applicative : Les logiciels (ex : NFS)Couche 6 - Présentation : Représentation des données (ex : XDR)Couche 5 - Session : Établissement et maintient des sessions (ex : RPC)Couche 4 - Transport : Liaison de bout en bout (ex : UDP, TCP, ...)Couche 3 - Réseau : Adressage et routage entre machines (ex : IP)Couche 2 - Liaison : Gestion des envois point à point (ex : Ethernet)Couche 1 - Physique : Support de transmission

Les Sockets Java offrent une abstraction du réseau au niveau descouches Transport (4) et Réseau (3). Java introduit doncdifférentes classes correspondant aux protocoles abstraits : TCP ouUDP.

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 4 / 16

Quel niveau d’abstraction pour le réseau ?

Les 7 couches du modèle OSI

Couche 7 - Applicative : Les logiciels (ex : NFS)Couche 6 - Présentation : Représentation des données (ex : XDR)Couche 5 - Session : Établissement et maintient des sessions (ex : RPC)Couche 4 - Transport : Liaison de bout en bout (ex : UDP, TCP, ...)Couche 3 - Réseau : Adressage et routage entre machines (ex : IP)Couche 2 - Liaison : Gestion des envois point à point (ex : Ethernet)Couche 1 - Physique : Support de transmission

Les Sockets Java offrent une abstraction du réseau au niveau descouches Transport (4) et Réseau (3). Java introduit doncdifférentes classes correspondant aux protocoles abstraits : TCP ouUDP.

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 4 / 16

La notion de mode de connecté

DéfinitionEn mode connecté, la communication entre un client et un serveur est pré-cédée d’une connexion et suivie d’une fermeture :

I Facilite la gestion d’étatI Meilleurs contrôle des arrivées/départs de clientsI Uniquement communication unicastI Plus lent au démarrage

DéfinitionEn mode non connecté, les messages sont envoyés librement :

I Plus facile à mettre en œuvreI Plus rapide au démarrage

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 5 / 16

Les protocoles TCP et UDP

TCP : une communication de type téléphoneI Mode connecté : protocole de prise de connexion (lent)I Sans perte : un message arrive au moins un foisI Sans duplication : un message arrive au plus une foisI Avec fragmentation : les messages peuvent être coupésI Ordre respecté : messages délivrés dans l’ordre d’émission

UDP : une communication de type courrierI Mode non connecté : pas de protocole de connexion (plus rapide)I Avec perte : l’émetteur n’est pas assuré de la délivranceI Avec duplication : un message peut arriver plus d’une foisI Sans fragmentation : les messages envoyés ne sont jamais coupés

=⇒ soit un message arrive entièrement, soit il n’arrive pasI Ordre non respecté : messages délivrés dans l’ordre d’arrivé

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 6 / 16

La notion de mode de connecté

AttentionIl ne faut pas confondre connexion au niveau transport etconnexion au niveau applicatif :

I FTP fonctionne en connecté en utilisant TCPI DNS fonctionne en non-connecté en utilisant UDPI HTTP fonctionne en non-connecté en utilisant TCP

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 7 / 16

Page 2: SRCS : La programmation réseau en Java. - Version 15

Les SocketsDéfinitionUne Socket est une API (interface logicielle) avec les services dusystème d’exploitation, qui permet d’exploiter facilement et demanière uniforme les services d’un protocole réseau.

Une socket est un demi-point de connexion d’une application.

Machine 1

Socket Socket

Machine 2

Java défini plusieurs classes de sockets suivant le protocole :I TCP : ServerSocket et SocketI UDP : DatagramSocket

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 8 / 16

Outline

Une abstraction des protocoles réseauGestion des addresses réseau en JavaLe sockets TCPLe sockets UDP

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 9 / 16

Identification des sockets

Une socket est identifiée par :I en absence de connexion : 〈@IP,port〉I en cas de connexion : (〈@IPsrc,portsrc〉,〈@IPdest,portdest〉)

AttentionDeux sockets peuvent occuper le même port local si elles sontconnectées sur des IPs et/ou ports différents.

Il existe deux classes pour gérer les addresses :InetAddress : représente une adresse internet (ip/fqdn)SocketAddress : représente l’adresse d’une socket

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 10 / 16

InetAddress : les adresses internetLa classe InetAddress sert à représenter les adresses internet

I pas de constructeur mais des méthodes statiques

InetAddress me = InetAddress.getByName("sopena.fr");System.out.println(me.getHostAddress()+" = "+me.getHostName());

90.46.19.126 = sopena.fr

InetAddress g = InetAddress.getByAddress(new byte[] {8,8,8,8});System.out.println(g.getHostAddress()+" = "+g.getCanonicalHostName());

8.8.8.8 = google-public-dns-a.google.com

InetAddress ici = InetAddress.getLocalHost();System.out.println(ici.getHostAddress()+" = "+ici.getHostName());

132.227.112.199 = ppti-14-508-07.ufr-info-p6.jussieu.fr

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 11 / 16

SocketAddress : les adresses internet

La classe InetSocketAddress sert à représenter 〈@IP,port〉 :I elle hérite de la classe abstraite SocketAddressI ces instances sont des objets immuablesI elle n’associe pas le protocole utilisé

On peut les construire ou les récupèrer de :I sockets existantesI de packets reçu ou émis

InetSocketAddress localhost =new InetSocketAddress("localhost", 8080);

socket.connect(localhost);

SocketAddress ici = socket.getLocalSocketAddress();SocketAddress labas = socket.getRemoteSocketAddress();

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 12 / 16

Outline

Une abstraction des protocoles réseauGestion des addresses réseau en JavaLe sockets TCPLe sockets UDP

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 13 / 16

Utilisation d’une socket TCP

Serveur Client

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Page 3: SRCS : La programmation réseau en Java. - Version 15

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080is = c.getInputStream()

os = c.getOutputStream()

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080is = c.getInputStream()

os = c.getOutputStream()x = is.read()

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080is = c.getInputStream()

os = c.getOutputStream()x = is.read()

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Page 4: SRCS : La programmation réseau en Java. - Version 15

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080is = c.getInputStream()

os = c.getOutputStream()x = is.read()

os.write(2)

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080is = c.getInputStream()

os = c.getOutputStream()x = is.read()

os.write(2) print("x="+x)print("x="+x)

y=3

x=2

x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080is = c.getInputStream()

os = c.getOutputStream()x = is.read()

os.write(2) print("x="+x)print("x="+x)is = c.getInputStream()

y = is.read()

y=3

x=2

x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080is = c.getInputStream()

os = c.getOutputStream()x = is.read()

os.write(2) print("x="+x)print("x="+x)is = c.getInputStream()

y = is.read()

y=3

x=2

x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080is = c.getInputStream()

os = c.getOutputStream()x = is.read()

os.write(2) print("x="+x)print("x="+x)is = c.getInputStream()

y = is.read()os = c.getOutputStream()

os.write(x+1)

y=3

x=2

x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080is = c.getInputStream()

os = c.getOutputStream()x = is.read()

os.write(2) print("x="+x)print("x="+x)is = c.getInputStream()

y = is.read()os = c.getOutputStream()

os.write(x+1) print("y="+y)

y=3 x=2

x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080is = c.getInputStream()

os = c.getOutputStream()x = is.read()

os.write(2) print("x="+x)print("x="+x)is = c.getInputStream()

y = is.read()os = c.getOutputStream()

os.write(x+1) print("y="+y)

x = is.read()

y=3 x=2

x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080is = c.getInputStream()

os = c.getOutputStream()x = is.read()

os.write(2) print("x="+x)print("x="+x)is = c.getInputStream()

y = is.read()os = c.getOutputStream()

os.write(x+1) print("y="+y)

x = is.read()

y=3 x=2

x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Page 5: SRCS : La programmation réseau en Java. - Version 15

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

is = c.getInputStream()os = c.getOutputStream()

x = is.read() os.write(2) print("x="+x)print("x="+x)is = c.getInputStream()

y = is.read()os = c.getOutputStream()

os.write(x+1) print("y="+y)

x = is.read()

c.close()

y=3 x=2

x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

is = c.getInputStream()os = c.getOutputStream()

x = is.read() os.write(2) print("x="+x)print("x="+x)is = c.getInputStream()

y = is.read()os = c.getOutputStream()

os.write(x+1) print("y="+y)

x = is.read()

c.close() print("x="+x)

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

c.connect(localhost,8080)Socket c =

is = c.getInputStream()os = c.getOutputStream()

x = is.read() os.write(2) print("x="+x)print("x="+x)is = c.getInputStream()

y = is.read()os = c.getOutputStream()

os.write(x+1) print("y="+y)

x = is.read()

c.close() print("x="+x)

c.close()

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Utilisation d’une socket TCP

Serveur Client

s = new ServerSocket(8080)

s.accept()

Socket c = new Socket()

c.connect(localhost,8080)Socket c =

is = c.getInputStream()os = c.getOutputStream()

x = is.read() os.write(2) print("x="+x)print("x="+x)is = c.getInputStream()

y = is.read()os = c.getOutputStream()

os.write(x+1) print("y="+y)

x = is.read()

c.close() print("x="+x)

c.close()s.close()

y=3 x=2x=-1

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Fermeture de la socket de connexion

Serveur Client

s = new ServerSocket(8080)s = new ServerSocket(8080)

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080

8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Fermeture de la socket de connexion

Serveur Client

s = new ServerSocket(8080)s = new ServerSocket(8080)

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080s.close()

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Fermeture de la socket de connexion

Serveur Client

s = new ServerSocket(8080)s = new ServerSocket(8080)

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080s.close() is = c.getInputStream()

os = c.getOutputStream()x = is.read()

os.write(2) print("x="+x)print("x="+x)

is = c.getInputStream()

y = is.read()

os = c.getOutputStream()

os.write(x+1)

print("y="+y)x = is.read()

c.close()

print("x="+x)

c.close()

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexion précoce : pas de socket de connexion

Serveur ClientSocket c = new Socket()

3823

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Page 6: SRCS : La programmation réseau en Java. - Version 15

Connexion précoce : pas de socket de connexion

Serveur ClientSocket c = new Socket()

3823 c.connect(localhost,8080)

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexion précoce : pas de socket de connexion

Serveur ClientSocket c = new Socket()

3823 c.connect(localhost,8080)

ConnectException

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexion précoce : avant le accept du serveur

Serveur Client

s = new ServerSocket(8080) 8080 Socket c = new Socket()

3823

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexion précoce : avant le accept du serveur

Serveur Client

s = new ServerSocket(8080) 8080 Socket c = new Socket()

3823 c.connect(localhost,8080)

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexion précoce : avant le accept du serveur

Serveur Client

s = new ServerSocket(8080) 8080 Socket c = new Socket()

3823 c.connect(localhost,8080)

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexion précoce : avant le accept du serveur

Serveur Client

s = new ServerSocket(8080) 8080

s.accept()

Socket c = new Socket()

3823 c.connect(localhost,8080)Socket c =

8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexions multiples sur une socket TCP

Serveur

s = new ServerSocket(8080) 8080

Client

8080

s.accept()

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexions multiples sur une socket TCP

Serveur

s = new ServerSocket(8080) 8080

Client

8080

s.accept()

Socket c1 = new Socket()3823

c1.connect(localhost,8080)

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Page 7: SRCS : La programmation réseau en Java. - Version 15

Connexions multiples sur une socket TCP

Serveur

s = new ServerSocket(8080) 8080

Client

8080

s.accept()

Socket c1 = new Socket()3823

c1.connect(localhost,8080)

8080Socket c1 =

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexions multiples sur une socket TCP

Serveur

s = new ServerSocket(8080) 8080

Client

8080

s.accept()

Socket c1 = new Socket()3823

c1.connect(localhost,8080)

8080Socket c1 =

s.accept()

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexions multiples sur une socket TCP

Serveur

s = new ServerSocket(8080) 8080

Client

8080

s.accept()

Socket c1 = new Socket()3823

c1.connect(localhost,8080)

8080Socket c1 =

s.accept()

Socket c2 = new Socket(4219)4219

c2.connect(localhost,8080)

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexions multiples sur une socket TCP

Serveur

s = new ServerSocket(8080) 8080

Client

8080

s.accept()

Socket c1 = new Socket()3823

c1.connect(localhost,8080)

8080Socket c1 =

s.accept()

Socket c2 = new Socket(4219)4219

c2.connect(localhost,8080)Socket c2 =

8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexions multiples sur une socket TCP

Serveur

s = new ServerSocket(8080) 8080

Client

8080

s.accept()

Socket c1 = new Socket()3823

c1.connect(localhost,8080)

8080Socket c1 =

s.accept()

Socket c2 = new Socket(4219)4219

c2.connect(localhost,8080)Socket c2 =

8080

s.accept()

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexions multiples sur une socket TCP

Serveur

s = new ServerSocket(8080) 8080

Client

8080

s.accept()

Socket c1 = new Socket()3823

c1.connect(localhost,8080)

8080Socket c1 =

s.accept()

Socket c2 = new Socket(4219)4219

c2.connect(localhost,8080)Socket c2 =

8080

s.accept() ClientSocket c = new

5829 Socket("sopena.fr",8080)

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexions multiples sur une socket TCP

Serveur

s = new ServerSocket(8080) 8080

Client

8080

s.accept()

Socket c1 = new Socket()3823

c1.connect(localhost,8080)

8080Socket c1 =

s.accept()

Socket c2 = new Socket(4219)4219

c2.connect(localhost,8080)Socket c2 =

8080

s.accept() ClientSocket c = new

5829 Socket("sopena.fr",8080)

8080Socket c3 =

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Connexions multiples sur une socket TCP

Serveur

s = new ServerSocket(8080) 8080

Client

8080

s.accept()

Socket c1 = new Socket()3823

c1.connect(localhost,8080)

8080Socket c1 =

s.accept()

Socket c2 = new Socket(4219)4219

c2.connect(localhost,8080)Socket c2 =

8080

s.accept() ClientSocket c = new

5829 Socket("sopena.fr",8080)

8080Socket c3 =

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Page 8: SRCS : La programmation réseau en Java. - Version 15

Connexions multiples sur une socket TCP

Serveur

s = new ServerSocket(8080) 8080

Client

8080

s.accept()

Socket c1 = new Socket()3823

c1.connect(localhost,8080)

8080Socket c1 =

s.accept()

Socket c2 = new Socket(4219)4219

c2.connect(localhost,8080)Socket c2 =

s.accept() ClientSocket c = new

5829 Socket("sopena.fr",8080)

8080Socket c3 =

c2.close()

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 14 / 16

Outline

Une abstraction des protocoles réseauGestion des addresses réseau en JavaLe sockets TCPLe sockets UDP

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 15 / 16

Utilisation d’une socket UDP

Serveur Client

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Page 9: SRCS : La programmation réseau en Java. - Version 15

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

Hello!

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

Hello!

System.out.println(new String(msg))

Hello !

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

Hello!

System.out.println(new String(msg))

System.out.println("From port : " + in.getPort())

Hello !

Hell

To port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Utilisation d’une socket UDP

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

Hello!

System.out.println(new String(msg))

System.out.println("From port : " + in.getPort()) System.out.println("To port : " +

out.getPort())

Hello !

Hell

To port : 5782To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Page 10: SRCS : La programmation réseau en Java. - Version 15

Émission précoce : avant ouverture de l’autre socket

Serveur Client

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant ouverture de l’autre socket

Serveur Clients = new DatagramSocket()

5782

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant ouverture de l’autre socket

Serveur Clients = new DatagramSocket()

5782

byte msg[] = "Hello!".getBytes()

Hello!

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant ouverture de l’autre socket

Serveur Clients = new DatagramSocket()

5782

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant ouverture de l’autre socket

Serveur Clients = new DatagramSocket()

5782

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant ouverture de l’autre socket

Serveur Clients = new DatagramSocket()

5782

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

System.out.println("To port : " + out.getPort())

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant ouverture de l’autre socket

Serveur Clients = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

System.out.println("To port : " + out.getPort())

s = new DatagramSocket(8080)

8080

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant le receive du serveur

Serveur Client

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Page 11: SRCS : La programmation réseau en Java. - Version 15

Émission précoce : avant le receive du serveur

Serveur Clients = new DatagramSocket()

5782

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant le receive du serveur

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant le receive du serveur

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant le receive du serveur

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

System.out.println("To port : " + out.getPort())

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant le receive du serveur

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

Hello!

System.out.println("To port : " + out.getPort())

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Émission précoce : avant le receive du serveur

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

Hello!

System.out.println(new String(msg))

System.out.println("From port : " + in.getPort()) System.out.println("To port : " +

out.getPort())

Hello !

Hell

To port : 5782To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Buffer de réception trop petit

Serveur Client

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Buffer de réception trop petit

Serveur Clients = new DatagramSocket(8080)

8080

byte msg[] = new byte[50]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Page 12: SRCS : La programmation réseau en Java. - Version 15

Buffer de réception trop petit

Serveur Clients = new DatagramSocket(8080)

8080

byte msg[] = new byte[4]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Buffer de réception trop petit

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[4]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Buffer de réception trop petit

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[4]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Buffer de réception trop petit

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[4]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

Hell

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16

Buffer de réception trop petit

Serveur Clients = new DatagramSocket(8080)

8080

s = new DatagramSocket()

5782

byte msg[] = new byte[4]

DatagramPacket in = new DatagramPacket(msg, 50)

@

s.receive(in)

byte msg[] = "Hello!".getBytes()

Hello!

InetAddress localhost = InetAddress.getByName("localhost")

@

DatagramPacket out = new DatagramPacket( msg, 0, msg.length, localhost, 8080)

s.send(out)

Hell

System.out.println(new String(msg))

System.out.println("From port : " + in.getPort()) System.out.println("To port : " +

out.getPort())

HellTo port : 5782

To port : 8080

J. Sopena (INRIA/UPMC) La programmation réseau en Java. 16 / 16