Vous êtes sur la page 1sur 22

Chapitre 7 : Java et les réseaux

La programmation réseau

Java
© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 1
Sommaire

La programmation réseau

Rappel Réseau
Couches réseau et TCP-IP
Notion de Socket
Notion de Port
La classe URL
Les Sockets Java
TCP/IP et les principaux services
La classe InetAdress
Processus de Sockets
Exemple de process serveur
Exemple de process client simple et multi-clients
Datagram- Buffered stream- et Data Stream- sockets

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 2


Rappel couches réseau et TCP/IP

Source Christine Bulfone : Le client/Serveu©r et l’API socket

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 3


Présentation de L’API Socket

Source Christine Bulfone : Le client/Serveu©r et l’API socket

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 4


La notion de « socket »
API (Application Program Interface) socket
Mécanisme d'interface de programmation
permet aux programmes dʼéchanger des données
Les application ne voient les couches de communication quʼà travers
lʼAPI socket (abstraction)
n'implique pas forcément une communication par le réseau
le terme « socket » signifie douille, prise électrique femelle

Une connexion est entièrement définie sur chaque


machine par :
le type de protocole (UDP ou TCP)
l'adresse IP
le numéro de port associé
au processus serveur : port local sur lequel les connexions sont attendues
client : allocation dynamique par le système
Source Christine Bulfone : Le client/Serveu©r et l’API socket

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 5


La notion de « port »
Un service rendu par un programme serveur sur une machine est
accessible par un port

Un port est identifié sur une machine par un nombre entier (16 bits)

de 0 à1023 :
ports réservés assignés par l'IANA (Internet Assigned Numbers Authority)
donnent accès aux services standard :

> 1024
ports utilisateurs disponibles pour placer un service applicatif quelconque
Source Christine Bulfone : Le client/Serveu©r et l’API socket

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 6


java.net
La classe URL
accès à une URL pour le Web /** la Classe java.net.URL :
://Hote[:port]/cheminDacces * encaps. Uniform Resource Locator
*/
getFile(), getHost(), getPort(), public final class URL
getProtocol(), getRef() retournent extends Java.lang.Object
les champs de l’URL implements serealizable
{ ...
Les données référencée par l’URL public final Object getContent()
peuvent être téléchargée de 3 throws IOException;
public URLConnection
façons : openConnection();
par un objet URLConnection créé throws IOException;
par openConnection() public final InputStream
par un objet InputStream créé par openStream();
openStream() throws IOException;
public String toString();
par l’appel à getContents() qui }
retourne directement le contenu try
pour plus de contrôle utiliser la URL lt = new URL (“http://...”);
catch (MalformedURLException e) {
classe URLConnection //...traitement d’erreur
getContent-Length-Type-Encoding... }

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 7


java.net
Sockets Java

Sockets: Utilité des “Datagram sockets”


communication peer-ro-peer multicast :
possède un nom et une adresse réseau envoi de paquets à un groupe (ex.
Les types de sockets : NetBios)
Datagram sockets Il existe une classe (java 1.1)
MulticastSocket dérivée de
interface pour l’accès UDP (User
DatagramSocket
Datagram Protocol)
transmissions de paquets broadcast :
indépendants “sans “ garantie envoi de paquets à l’ensemble
Stream sockets des entités d’un réseau
interface pour l’accès TCP situation de découverte :
(Transmission Control Protocol)
découvrir des entités du réseaux,
guarantie de transmission...
nouveau service disponible
Raw sockets
interface au protocol IP (Internet
messagerie non critique :
Protocol) ou ICMP (Internet Control envoi de messages de contrôle
Message Protocol) d’activité non critiques “Je suis en
tests de nouveaux protocoles ou fcts vie”
évoluées

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 8


java.net
TCP/IP et les principaux services

Application NIS
NIS NFS
NFS

TELNET

Etc...
TELNET

Etc...
HTTP

SMTP
X11

FTP

HTTP

SMTP
X11

FTP
Présentation XDR
XDR

Session
Sockets
RPC
RPC

Transport UDP
UDP TCP
TCP

Réseau IP
IP

Liaison Ethernet
Ethernet FDDI
FDDI Token
Token Ring
Ring Etc...
Etc...

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 9


java.net
La classe InetAdress

faire plus que télécharger un objet /** la Classe InetAdress:


* encapsulation d’une adresse IP
référencé par une URL. */
écrire un serveur par exemple... public final class InetAdress
accès à une adresse sur TCP/IP extends Java.lang.Object
{ // Methodes de classes
Net_id.Host_id.Port_ID public static InetAdress
206.24.45.100 getByName(String host)
“java.sun.com” throws UnknownHostException;
// ttes les @IP associées à un Host
Cette classe permet de se public static InetAdress []
connecter à un port d’un Host getAllByName(String host)
throws UnknownHostException;
Internet et d’écrire/lire des public static InetAdress
données des classes java.io. getLocalHost(String host)
throws UnknownHostException;
Pas de constructeur // Méthodes d’instances
utilisation de getLocalHost(), public boolean equals (Object obj);
getByName() ou getAllByName() public byte[] getAdress();
public getHostName();
tests sans le réseau... public hashCode();
//retourn le “localhost” public String toString();
addr = InetAddress.getByName(null); }

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 10


Processus de Sockets

Source Christine Bulfone : Le client/Serveu©r et l’API socket

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 11


java.net
Processus de Sockets - 1

creation et initialisation d’une Socket()


Socket() Serveur
“Socket” : appel de socket(...)

Socket()
Socket()

Client

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 12


java.net
Processus de Sockets - 2

Établissement d’un service sur un Socket()


Socket() Serveur
port de la machine serveur pour
être visible du réseau : bind(...) bind()
bind()

Socket()
Socket()

Client

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 13


java.net
Processus de Sockets - 3

attente de connexions, le serveur Socket()


Socket() Serveur
est prêt : appel de listen(...)
bind()
bind()

Socket()
Socket() listen()
listen()

un
unserveur
serveur“Datagram
“Datagramsockets”
sockets”
Client n’utilise
n’utilisepas
pasde
delisten()
listen()::ililn’y
n’yaa
pas
pasde dedéroulement
déroulementde desessions
sessions

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 14


java.net
Processus de Sockets - 4

Un Client initialise une connexion à Socket()


Socket() Serveur
un service : appel de connect()
bind()
bind()

Socket()
Socket() listen()
listen()

session création
connect()
connect() accept()
accept()
TCP thread

Client accept()
accept()
attente client
suivant

un
unserveur
serveur“Datagram
“Datagram  Le serveur accepte la connexion
sockets”
sockets”n’utilise
n’utilisepas
pas accept() et déclenche un nouveau
de
deaccept()
accept() processus pour prendre en compte le
client
© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 15
java.net
Processus de Sockets - 5

le client et le serveur échangent leurs Socket()


Socket() Serveur
données : en général par des read() et
write() dans un objet Stream “Datagram
bind()
“Datagram
bind() sockets”
sockets”utilise
utilise
send()
send()et
etreceive()
receive()plutôt
plutôtque
que
Socket()
Socket() read() et
etwrite()
listen()
read()
listen() write()

session création
connect()
connect() accept()
accept()
TCP thread

Client accept()
accept()
attente client
suivant
write()
write() read()
read()
nbXLab
read()
read() write()
write()
50

close()
close() close()
close()

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 16


java.net
Processus de Sockets - 6
fermeture du Socket : les sockets sont
des ressources limitées et doivent être Socket()
Socket() Serveur
fermées par les deux parties cliente et
serveur bind()
bind()

Socket()
Socket() listen()
listen()

session création
connect()
connect() accept()
accept()
TCP thread

Client accept()
accept()
attente client
suivant
write()
write() read()
read()
nbXLab
read()
read() write()
write()
50

close()
close() close()
close()

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 17


java.net
Exemple de serveur

/** un serveur tres simple qui renvoie ce PrintWriter out =


* qu’il reçoit : serveur miroir new PrintWriter(
*/ new OutputStreamWriter(
import java.io.*; socket.getOutputStream()));
import java.net.*; while (true) {
public class ServerMiroir { String str = in.readLine();
// Choisir un no de port non entre 1-1024 if (str.equals("END")) break;
static final int port = 8080; System.out.println
public static void main(String[] args ) { ("Echoing: " + str);
try { out.println(str);
ServerSocket s = new ServerSocket(port); out.flush(); // Ne pas oublier!
System.out.println("Serv Started: " + s); }
// Blocks until a connection occurs: System.out.println("closing...");
Socket socket = s.accept(); socket.close();
System.out.println( } catch(Exception e) {
"Connect. accepted, socket: "+ socket); e.printStackTrace();
BufferedReader in = }
new BufferedReader( }
new InputStreamReader( }
socket.getInputStream()));

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 18


java.net
Exemple de process serveur

/** un serveur tres simple qui renvoie ce PrintWriter out =


* qu’il reçoit : serveur miroir new PrintWriter(
*/ new OutputStreamWriter(
import java.io.*; socket.getOutputStream()));
sinon
sinon lele buffer
buffer
import java.net.*; while (true) {n’est pas écrit
Pas n’est pas écrit
public class ServerMiroir { Pas d’@
d’@ IP
IP :: String str = in.readLine();
sur
sur le
le réseau
réseau
// Choisir un no de port entre 1-1024exécuté
exécuté sur
sur if (str.equals("END"))
tant qu’il break;
n’est
static final int port = 8080; la machine tant
System.out.println
qu’il n’est
la machine pas plein
pas plein
public static void main(String[] argscourante
) { ("Echoing: " + str);
courante
try { out.println(str);
Représente
ServerSocket s = new ServerSocket(port);
Représente out.flush(); // Ne pas oublier!
la
la connection
System.out.println("Serv Started: " + s);
connection }
// Blocks until a connection occurs: System.out.println("closing...");
Socket socket = s.accept(); socket.close();
System.out.println( } catch(Exception e) {
"socket: "+ socket); e.printStackTrace();
BufferedReader in = }
new BufferedReader(
appel
}appel automatique
automatique àà toString()
toString()
new InputStreamReader( } socket: [addr=207.0.0.1,
socket: [addr=207.0.0.1,
socket.getInputStream())); port=1077,
port=1077, localport=8080]
localport=8080]

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 19


java.net
Exemple de process Client

/** Un client tres simple qui envoie n DataInputStream in =


* lignes au serveur et lit n ligne new DataInputStream(
*/ new BufferedInputStream(
import java.io.*; socket.getInputStream()));
import java.net.*; PrintStream out =
public class ClientMiroir { new PrintStream(
static final int port = 8080; new BufferedOutputStream(
public static void main(String args[]) { socket.getOutputStream()));
try { for(int i = 0; i < 10; i ++) {
// Passing null to getByName() produces the out.println("howdy " + i);
// special "Local Loopback" IP address, for out.flush(); // Ne pas oublier
// testing on one machine w/o a network: String str = in.readLine();
InetAddress addr = System.out.println(str);
InetAddress.getByName(null); }
// On aurait pu utiliser l’adresse ou out.println("END");
// le nom de façon équivalente out.flush(); // Ne pas oublier!
// InetAddress.getByName("127.0.0.1"); socket.close();
// InetAddress.getByName("localhost"); } catch(Exception e) {
System.out.println("addr = " + addr); e.printStackTrace(); }
Socket socket = new Socket(addr, port); }
System.out.println("socket = " + socket); }

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 20


java.net
Gestion de plusieurs clients pour le serveur

import java.io.*; import java.net.*; public class MultiServerMiroir {


class ServerMiroir extends Thread { private static final int port = 8080;
Socket socket;
public static void main(String[] args )
private BufferedReader in;
{
private PrintWriter out;
try {
ServerMiroir (Socket s) {
socket = s; ServerSocket s = new
try { in = new BufferedReader( new ...); ServerSocket(port);
out = new PrintWriter( new...); System.out.println("Serv. Started");
} catch(IOException e) {...} while(true) {
start(); // Calls run() // Bloque jusqu’a connexion
} Socket socket = s.accept();
public void run() { new ServerMiroir(socket);
try { }
while (true) { //lire s = in.readLine}
} catch(Exception e) {
System.out.println("closing...");
e.printStackTrace();
in.close(); out.close();
}
socket.close();
} catch (IOException e) { ... } }
} }
}

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 21


java.net
Datagram- Buffered stream- et Data Stream- sockets

Datagram Buf.Stream DataStream CORBA


fiabilité de la communication Non Oui Oui Oui

Paramètres typés Non Non Oui Oui

performances très bonne bonne mauvaise bonne


1,8 ms 2 ms 301 ms 3,2 ms
Sécurité Oui Oui Oui Oui

Desciptions d’Interface Non Non Non Oui

Les sockets fournissent un moyen de bas niveau pour


la programmation réseau

La programmation d’une appli. Client/Serveur doit y


plutôt s’appuyer sur CORBA IIOP et Java RMI

© Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 22