coursjava: laprogrammationréseauen java

93
Cours JAVA : La programmation réseau en Java. Version 1.01 Julien Sopena 1 1 [email protected] Équipe REGAL - INRIA Rocquencourt LIP6 - Université Pierre et Marie Curie Licence professionnelle DANT - 2015/2016 J. Sopena (INRIA/UPMC) La programmation réseau en Java. 1 / 16

Upload: others

Post on 23-Jul-2022

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CoursJAVA: Laprogrammationréseauen Java

Cours JAVA :La programmation réseau en Java.

Version 1.01

Julien Sopena1

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

Licence professionnelle DANT - 2015/2016

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

Page 2: CoursJAVA: Laprogrammationréseauen Java

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

Page 3: CoursJAVA: Laprogrammationréseauen Java

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

Page 4: CoursJAVA: Laprogrammationréseauen Java

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

Page 5: CoursJAVA: Laprogrammationréseauen Java

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

Page 6: CoursJAVA: Laprogrammationréseauen Java

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

Page 7: CoursJAVA: Laprogrammationréseauen Java

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

Page 8: CoursJAVA: Laprogrammationréseauen Java

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 9: CoursJAVA: Laprogrammationréseauen Java

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

Page 10: CoursJAVA: Laprogrammationréseauen Java

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

Page 11: CoursJAVA: Laprogrammationréseauen Java

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

Page 12: CoursJAVA: Laprogrammationréseauen Java

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

Page 13: CoursJAVA: Laprogrammationréseauen Java

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

Page 14: CoursJAVA: Laprogrammationréseauen Java

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

Page 15: CoursJAVA: Laprogrammationréseauen Java

Utilisation d’une socket TCP

Serveur Client

y=3 x=2x=-1

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

Page 16: CoursJAVA: Laprogrammationréseauen Java

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 17: CoursJAVA: Laprogrammationréseauen Java

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

Page 18: CoursJAVA: Laprogrammationréseauen Java

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

Page 19: CoursJAVA: Laprogrammationréseauen Java

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

Page 20: CoursJAVA: Laprogrammationréseauen Java

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

Page 21: CoursJAVA: Laprogrammationréseauen Java

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

Page 22: CoursJAVA: Laprogrammationréseauen Java

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

Page 23: CoursJAVA: Laprogrammationréseauen Java

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 24: CoursJAVA: Laprogrammationréseauen Java

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 25: CoursJAVA: Laprogrammationréseauen Java

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

Page 26: CoursJAVA: Laprogrammationréseauen Java

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

Page 27: CoursJAVA: Laprogrammationréseauen Java

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

Page 28: CoursJAVA: Laprogrammationréseauen Java

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

Page 29: CoursJAVA: Laprogrammationréseauen Java

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

Page 30: CoursJAVA: Laprogrammationréseauen Java

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

Page 31: CoursJAVA: Laprogrammationréseauen Java

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 32: CoursJAVA: Laprogrammationréseauen Java

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 33: CoursJAVA: Laprogrammationréseauen Java

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

Page 34: CoursJAVA: Laprogrammationréseauen Java

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

Page 35: CoursJAVA: Laprogrammationréseauen Java

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

Page 36: CoursJAVA: Laprogrammationréseauen Java

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

Page 37: CoursJAVA: Laprogrammationréseauen Java

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

Page 38: CoursJAVA: Laprogrammationréseauen Java

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

Page 39: CoursJAVA: Laprogrammationréseauen Java

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

Page 40: CoursJAVA: Laprogrammationréseauen Java

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 41: CoursJAVA: Laprogrammationréseauen Java

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

Page 42: CoursJAVA: Laprogrammationréseauen Java

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

Page 43: CoursJAVA: Laprogrammationréseauen Java

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

Page 44: CoursJAVA: Laprogrammationréseauen Java

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

Page 45: CoursJAVA: Laprogrammationréseauen Java

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

Page 46: CoursJAVA: Laprogrammationréseauen Java

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

Page 47: CoursJAVA: Laprogrammationréseauen Java

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

Page 48: CoursJAVA: Laprogrammationréseauen Java

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 49: CoursJAVA: Laprogrammationréseauen Java

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

Page 50: CoursJAVA: Laprogrammationréseauen Java

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

Page 51: CoursJAVA: Laprogrammationréseauen Java

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

Page 52: CoursJAVA: Laprogrammationréseauen Java

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

Page 53: CoursJAVA: Laprogrammationréseauen Java

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

Page 54: CoursJAVA: Laprogrammationréseauen Java

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

Page 55: CoursJAVA: Laprogrammationréseauen Java

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 56: CoursJAVA: Laprogrammationréseauen Java

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 57: CoursJAVA: Laprogrammationréseauen Java

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

Page 58: CoursJAVA: Laprogrammationréseauen Java

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

Page 59: CoursJAVA: Laprogrammationréseauen Java

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

Page 60: CoursJAVA: Laprogrammationréseauen Java

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

Page 61: CoursJAVA: Laprogrammationréseauen Java

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

Page 62: CoursJAVA: Laprogrammationréseauen Java

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

Page 63: CoursJAVA: Laprogrammationréseauen Java

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

Page 64: CoursJAVA: Laprogrammationréseauen Java

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 65: CoursJAVA: Laprogrammationréseauen Java

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 66: CoursJAVA: Laprogrammationréseauen Java

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

Page 67: CoursJAVA: Laprogrammationréseauen Java

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

Page 68: CoursJAVA: Laprogrammationréseauen Java

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

Page 69: CoursJAVA: Laprogrammationréseauen Java

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

Page 70: CoursJAVA: Laprogrammationréseauen Java

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

Page 71: CoursJAVA: Laprogrammationréseauen Java

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

Page 72: CoursJAVA: Laprogrammationréseauen Java

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 73: CoursJAVA: Laprogrammationréseauen Java

É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

Page 74: CoursJAVA: Laprogrammationréseauen Java

É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

Page 75: CoursJAVA: Laprogrammationréseauen Java

É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

Page 76: CoursJAVA: Laprogrammationréseauen Java

É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

Page 77: CoursJAVA: Laprogrammationréseauen Java

É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

Page 78: CoursJAVA: Laprogrammationréseauen Java

É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

Page 79: CoursJAVA: Laprogrammationréseauen Java

É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

Page 80: CoursJAVA: Laprogrammationréseauen Java

É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 81: CoursJAVA: Laprogrammationréseauen Java

É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

Page 82: CoursJAVA: Laprogrammationréseauen Java

É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

Page 83: CoursJAVA: Laprogrammationréseauen Java

É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

Page 84: CoursJAVA: Laprogrammationréseauen Java

É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

Page 85: CoursJAVA: Laprogrammationréseauen Java

É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

Page 86: CoursJAVA: Laprogrammationréseauen Java

É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

Page 87: CoursJAVA: Laprogrammationréseauen Java

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

Page 88: CoursJAVA: Laprogrammationréseauen Java

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 89: CoursJAVA: Laprogrammationréseauen Java

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

Page 90: CoursJAVA: Laprogrammationréseauen Java

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

Page 91: CoursJAVA: Laprogrammationréseauen Java

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

Page 92: CoursJAVA: Laprogrammationréseauen Java

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

Page 93: CoursJAVA: Laprogrammationréseauen Java

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