Vous êtes sur la page 1sur 46

Programmation rseau en java : les sockets

M. Belguidoum
Universit Mentouri de Constantine
Dpartement Informatique

M. Belguidoum (UMC) Programmation rseau 1 / 46


Plan

1 Rappel sur les entres/sorties

2 Introduction et rappels sur les sockets

3 Socket en mode ux

4 Socket en mode datagram

5 Socket en mode multicast

6 Conclusion

M. Belguidoum (UMC) Programmation rseau 2 / 46


Rappel sur les entres/sorties

Rappel sur les entres/sorties

lecture d'informations mises par une source externe, ou envoi


d'informations une destination externe
sur le rseau, dans un chier du disque dur local, dans un autre
programme s'excutant en parallle, ou encore dans la mmoire.
en java les entres sorties sont gres par les objets de ux.

M. Belguidoum (UMC) Programmation rseau 3 / 46


Rappel sur les entres/sorties

Rappel sur les entres/sorties : les ux


un ot est un canal de communication dans lequel les donnes sont
crites ou lues de manire squentielle.
un ux en lecture permet de lire les informations de manire
squentielle.
un ux en criture permet d'crire les informations de manire
squentielle.
les classes d'entres/sorties sont dnies dans le paquetage java.io.
ceux qui manipulent des octets (InputStream, OutputStream et leurs
classes drives). Les ux binaires (octets) peuvent servir charger en
mmoire des images, les enregistrer sur le disque ou enregistrer des
objets (procd nomm srialisation) ou les charger (dsrialisation ).
ceux qui manipulent des caractres (Reader, Writer et leurs classes
drives), les caractres en java sont cods sur 16 bits (Unicode). Ces
ux servent grer les jeux de caractres (conversion, etc.).
Les classes InputStream, OutputStream, Reader et Writer sont
abstraites, c.a.d. qu'elles dnissent des mthodes communes tout
leurs hritiers.
M. Belguidoum (UMC) Programmation rseau 4 / 46
Rappel sur les entres/sorties

Rappel sur les entres/sorties : les ux

M. Belguidoum (UMC) Programmation rseau 5 / 46


Rappel sur les entres/sorties

Rappel sur les entres/sorties : les ux binaires

M. Belguidoum (UMC) Programmation rseau 6 / 46


Rappel sur les entres/sorties

Rappel sur les entres/sorties : les ux caractres

M. Belguidoum (UMC) Programmation rseau 7 / 46


Rappel sur les entres/sorties

Rappel sur les entres/sorties : les ux

Les classes d'entres/sorties


Entre Sortie
Binaire InputStream OutputStream
Texte Reader Writer
Les classes d'entres/sorties les plus utilises
Entre Sortie
Binaire FileInputStream FileOutputStream
Texte BufferedReader, FileReader BufferedWriter, FileWriter
Les mthodes d'entres/sorties les plus courantes
Entre Sortie
Binaire read() write()
Texte readLine() println

M. Belguidoum (UMC) Programmation rseau 8 / 46


Rappel sur les entres/sorties

Rappel sur les entres/sorties : les ux binaires

M. Belguidoum (UMC) Programmation rseau 9 / 46


Rappel sur les entres/sorties

Rappel sur les entres/sorties : les chiers binaires

M. Belguidoum (UMC) Programmation rseau 10 / 46


Rappel sur les entres/sorties

Rappel sur les entres/sorties : les chiers texte

Pour crire dans un chier, il faut disposer d'un ux d'criture. On


peut utiliser la classe FileWriter ou la classe PrintWriter :
FileWriter(String fileName) : cre le chier de nom leName
PrintWriter(Writer out) : l'argument est de type Writer, c.a.d.
un ux d'criture (dans un chier, sur le rseau,...)
Pour lire le contenu d'un chier, il faut disposer d'un ux de lecture
associ au chier. On peut utiliser pour cela la classe FileReader ou
BufferedReader :
FileReader(String nomFichier) : ouvre un ux de lecture partir
du chier indiqu. Lance une exception si l'opration choue.
BufferedReader(Reader in) : ouvre un ux de lecture bueris
partir d'un ux d'entre in. Ce ux de type Reader peut provenir du
clavier, d'un chier, du rseau, ...

M. Belguidoum (UMC) Programmation rseau 11 / 46


Rappel sur les entres/sorties

Rappel sur les entres/sorties : E/S standard


Utiliser deux ux du type InputStream et OutputStream qui
s'appellent System.in et System.out.
Le ux de donnes provenant du clavier est dsign par l'objet
System.in de type InputStream. Il permet de lire des donnes
caractre par caractre.
Le type InputStream ne permet pas de lire d'un seul coup une ligne
de texte. Le type BufferedReader le permet avec la mthode
readLine().
import java . io .*;
public class Hello {
public static void main ( String [] args ) throws IOException
{
BufferedReader in =
new BufferedReader ( new InputStreamReader ( System . in ));
System . out . println ( " Entrez votre nom : " );
String name = in . readLine ();
System . out . println ( " Hello , "+ name );
} }
M. Belguidoum (UMC) Programmation rseau 12 / 46
Rappel sur les entres/sorties

Rappel sur les entres/sorties : Flux entrants

M. Belguidoum (UMC) Programmation rseau 13 / 46


Rappel sur les entres/sorties

Rappel sur les entres/sorties : Flux sortants

M. Belguidoum (UMC) Programmation rseau 14 / 46


Rappel sur les entres/sorties

Rappel sur les entres/sorties : la srialisation


Srialisation : consiste crire des donnes prsentes en mmoire
vers un ux de donnes binaires, c'est donc la reprsentation sous
forme binaire d'un objet Java
Utilis pour changer des objets (envoi d'objets, persistance, ...)
Ne marche qu'avec des Objets implantant l'interface serializable
Java a introduit des outils permettant de srialiser les objets de
manire transparente et indpendante du systme d'exploitation.
La srialisation peut s'appliquer facilement tous les objets.

M. Belguidoum (UMC) Programmation rseau 15 / 46


Introduction et rappels sur les sockets

Rappels sur les sockets


Une socket represente un point de communication entre un processus
et un rseau.
Un processus client et un processus serveur, lorsqu'ils communiquent,
ouvrent donc chacun une socket.
A chaque socket est associ un port de connexion. Ces numros de
port sont uniques sur un systme donn, une application pouvant en
utiliser plusieurs (un serveur par exemple exploite une socket par client
connect).
Un port est identi par un entier (16 bits).

M. Belguidoum (UMC) Programmation rseau 16 / 46


Introduction et rappels sur les sockets

Rappels sur les sockets

Les ports numrots de 0 511 sont les "well known ports" de


l'architecture TCP/IP. Ils donnent accs aux services standard de
l'interconnexion : transfert de chiers (FTP port 21), terminal (Telnet
port 23), courrier (SMTP port 25), serveur web (HTTP port 80)
De 512 1023, on trouve les services Unix.
Au del, (1024 ...) ce sont les ports "utilisateurs" disponibles pour
placer un service applicatif quelconque.
Une connexion est identie de faon unique par la donne de deux
couples, une adresse IP et un numro de port, un pour le client et un
autre pour le serveur.
Une communication client/serveur n'a pas forcment lieu via un
rseau. Il est en eet possible de faire communiquer un client et un
serveur sur une mme machine, via l'interface de loopback,
reprsente par convention par l'adresse IP 127.0.0.1.
M. Belguidoum (UMC) Programmation rseau 17 / 46
Introduction et rappels sur les sockets

Rappels sur les sockets


Il existe deux modes de communication : suivant si elles sont
prcdes ou pas d'une ouverture de communication et suivies ou pas
d'une fermeture
mode connect : la communication entre un client et un serveur est
prcde d'une connexion et suivi d'une fermeture
Facilite la gestion d'tat

Meilleurs contrle des arrives/dparts de clients

Uniquement communication unicast

Plus lent au dmarrage

mode non connect : les messages sont envoys librement


Plus facile mettre en uvre

Plus rapide au dmarrage

la connexion au niveau transport 6= au niveau application


Mode couche transport couche application
Connect TCP FTP, Telnet, SMTP, POP, JDBC

Non connect UDP HTTP, NFS, DNS, TFTP

M. Belguidoum (UMC) Programmation rseau 18 / 46


Introduction et rappels sur les sockets

Rappels sur les sockets

Une socket est donc identie par


Une adresse IP : une des adresses de la machine
Un port : attribu automatiquement ou choisi par le programme

=> Adresse de Socket = Adresse IP + port

Une socket communique avec une autre socket via son adresse
Flux : une socket se connecte une autre socket via son adresse de
socket
Datagram : une socket envoie/reoit des donnes /d'une autre
socket identie par son adresse de socket

M. Belguidoum (UMC) Programmation rseau 19 / 46


Introduction et rappels sur les sockets

Rappels sur les sockets

Sockets en Java : uniquement oriente transport (couche 4)


Deux API pour les sockets
java.net : API bloquante (aborde dans ce cours)
java.nio.channels (> 1.4) : API non bloquante (pas aborde)

M. Belguidoum (UMC) Programmation rseau 20 / 46


Introduction et rappels sur les sockets

Principe de fonctionnement

le serveur enregistre son service sous un numro de port, indiquant


le nombre de clients qu'il accepte de faire buriser un instant T
(new serverSocket(...))
le serveur se met en attente d'une connexion (mthode accept()
de son instance de ServerSocket)
le client peut alors tablir une connexion en demandant la cration
d'une socket (new Socket()) destination du serveur pour le port
sur lequel le service a t enregistr.
le serveur sort de son accept() et rcupre une Socket de
communication avec le client
le client et le serveur peuvent alors utiliser des InputSteam et
OutputStream pour changer les donnes

M. Belguidoum (UMC) Programmation rseau 21 / 46


Socket en mode ux

Socket en mode ux

Liaison par ux : Socket/ServerSocket (TCP)


Connect : protocole de prise de connexion (lent), communication
uniquement point point
Sans perte : un message arrive au moins un fois
Sans duplication : un message arrive au plus une fois
Avec fragmentation : les messages sont coups
Ordre respect : Communication de type tlphone

M. Belguidoum (UMC) Programmation rseau 22 / 46


Socket en mode ux

Socket en mode ux

M. Belguidoum (UMC) Programmation rseau 23 / 46


Socket en mode ux

TCP/IP : le serveur (java.net.ServerSocket)

il utilise la classe java.net.ServerSocket pour accepter des


connexions de clients
quand un client se connecte un port sur lequel un ServerSocket
coute, ServerSocket cre une nouvelle instance de la classe Socket
pour supporter les communications ct serveur
int port =...;
ServerSocket server = new ServerSocket ( port );
Socket connection = server . accept ();

M. Belguidoum (UMC) Programmation rseau 24 / 46


Socket en mode ux

TCP/IP : le serveur (java.net.ServerSocket)

les constructeurs et la plus part des mthodes peuvent gnrer une


IOException
la mthode accept() est dite bloquante ce qui implique de la mettre
dans une boucle innie qui se termine seulement si une erreur grave se
produit
final int PORT = ...;
try {
ServerSocket serveur = new ServerSocket ( PORT ,5);
while ( true ) {
Socket socket = serveur . accept ();
}
}
catch ( IOException e ){
... }

M. Belguidoum (UMC) Programmation rseau 25 / 46


Socket en mode ux

TCP/IP : le serveur (java.net.ServerSocket)

Constructeur : n port
ServerSocket s = new ServerSocket (8080);

Mthodes principales
adresse IP : InetAddress getInetAddress()
port : int getLocalPort()
attente de connexion : Socket accept() mthode bloquante
fermeture : void close()
Options TCP : timeOut, receiveBufferSize

M. Belguidoum (UMC) Programmation rseau 26 / 46


Socket en mode ux

TCP/IP : le client (java.net.Socket)

le client se connecte au serveur en crant une instance de la classe


java.net.Socket : connexion synchrone
String host = ...;
int port = ...;
Socket connection = new Socket ( host , port );

la socket permet de supporter les communications ct client


la mthode close() ferme (dtruit) le socket
les constructeurs et la plupart des mthodes peuvent gnrer une
IOException
le serveur doit tre dmarr avant le client. Dans le cas contraire, si le
client se connecte un serveur inexistant, une exception sera leve
aprs un time-out

M. Belguidoum (UMC) Programmation rseau 27 / 46


Socket en mode ux

TCP/IP : le client (java.net.Socket)

final String HOST = " ... ";


final int PORT = ...;
try {
Socket socket = new Socket ( HOST , PORT );
}
finally {
try { socket . close ();} catch ( IOException e ){}
}

M. Belguidoum (UMC) Programmation rseau 28 / 46


Socket en mode ux

TCP/IP : le client (java.net.Socket)

Constructeur : adresse + n port


Socket s = new Socket (" www . lifl . fr " ,80);
Socket s = new Socket ( inetAddress ,8080);

Les mthodes principales


adresse IP : InetAddress getInetAddress(),
getLocalAddress()
port : int getPort(), getLocalPort()
ux in : InputStream getInputStream()
ux out : OutputStream getOutputStream()
fermeture : close()
Options TCP : timeOut, soLinger, tcpNoDelay, keepAlive

M. Belguidoum (UMC) Programmation rseau 29 / 46


Socket en mode ux

TCP/IP : le client (java.net.Socket)


Retrouver les adresses IP et les ports

M. Belguidoum (UMC) Programmation rseau 30 / 46


Socket en mode ux

TCP/IP : le ux de donnes

une fois la connexion ralise, il faut obtenir les streams d'E/S


(java.io) auprs de l'instance de la classe Socket en cours
Flux entrant
obtention d'un stream simple : dnit les oprations de base
InputSteam in = socket.getInputStream();
cration d'un stream convertissant les bytes reus en char
InputSteamReader reader = new InputStreamReader(in);
cration d'un stream de lecture avec tampon : pour lire ligne par ligne
dans un stream de caractres
BufferedReader istream = new BufferedReader(reader);
lecture d'une chane de caractres
String line = istream.readline();

M. Belguidoum (UMC) Programmation rseau 31 / 46


Socket en mode ux

TCP/IP : le ux de donnes

Flux sortant
obtention du ot de donnes sortantes : bytes
OutputSteam out = socket . getOutputStream ();

cration d'un stream convertissant les bytes en chanes de caractres


PrintWriter ostream = new PrintWriter(out);
envoi d'une ligne de caractres ostream.println(str);
envoi eectif sur le rseau des bytes (important) ostream.flush();

M. Belguidoum (UMC) Programmation rseau 32 / 46


Socket en mode ux

TCP/IP : le ux de donnes

try {
Socket socket = new Socket ( HOST , PORT );
// Lecture du flux d ' entre en provenance du serveur
InputStreamReader reader = new
InputStreamReader ( socket . getInputStream ());
BufferedReader istream = new BufferedReader ( reader );
String line = istream . readLine ();
// Echo la ligne lue vers le serveur
PrintWriter ostream = new PrintWriter ( socket . getOutputStream ());
ostream . println ( line );
ostream . flush ();
} catch ( IOException e) {...}
finally { try { socket . close ();} catch ( IOException e ){}}

M. Belguidoum (UMC) Programmation rseau 33 / 46


Socket en mode datagram

Socket en mode datagram

Liaison par datagram : DatagramSocket/DatagramPacket (UDP)


Non connect : pas de protocole de connexion (plus rapide)
Avec perte : l'metteur n'est pas assur de la dlivrance
Avec duplication : un message peut arriver plus d'une fois
Sans fragmentation : les messages envoys ne sont jamais coups :
soit un message arrive entirement, soit il n'arrive pas
Ordre non respect : Communication de type courrier

M. Belguidoum (UMC) Programmation rseau 34 / 46


Socket en mode datagram

Socket en mode datagram

M. Belguidoum (UMC) Programmation rseau 35 / 46


Socket en mode datagram

Socket en mode datagram

Il faut utiliser les classes DatagramPacket et DatagramSocket


Ces objets sont initialiss diremment selon qu'ils sont utiliss pour
envoyer ou recevoir des paquets

M. Belguidoum (UMC) Programmation rseau 36 / 46


Socket en mode datagram

Socket en mode datagram : envoi d'un datagram

1 crer un DatagramPacket en spciant :


les donnes envoyer
leur longueur
la machine rceptrice et le port
2 utiliser la mthode send(DatagramPacket) de DatagramSocket
pas d'arguments pour le constructeur car toutes les informations se
trouvent dans le paquet envoy

M. Belguidoum (UMC) Programmation rseau 37 / 46


Socket en mode datagram

Socket en mode datagram : envoi d'un datagram

// Machine destinataire
InetAddress address = InetAddress . getByName (" rainbow . essi . fr " );
static final int PORT = 4562;
// Cration du message envoyer
String s = new String (" Message envoyer " );
int longueur = s. length ();
byte [] message = new byte [ longueur ];
// Initialisation du paquet avec toutes les informations
DatagramPacket paquet = new DatagramPacket ( message , longueur ,
address , PORT );
// Cration du socket et envoi du paquet
DatagramSocket socket = new DatagramSocket ();
socket . send ( paquet );....

M. Belguidoum (UMC) Programmation rseau 38 / 46


Socket en mode datagram

Socket en mode datagram : rception d'un datagram

1 crer un DatagramSocket qui coute sur le port de la machine du


destinataire
2 crer un DatagramPacket pour recevoir les paquets envoys par le
serveur : dimensionner le buer assez grand
3 utiliser la mthode receive() de DatagramPacket : cette mthode
est bloquante

M. Belguidoum (UMC) Programmation rseau 39 / 46


Socket en mode datagram

Socket en mode datagram : rception d'un datagram

// Dfinir un buffer de rception


byte [] buffer = new byte [1024];
// On associe un paquet un buffer vide pour la rception
DatagramPacket paquet = new
DatagramPacket ( buffer , buffer . length ());
// On cre un socket pour couter sur le port
DatagramSocket socket = new DatagramSocket ( PORT );
while ( true ) {
// attente de rception
socket . receive ( paquet );
// affichage du paquet reu
String s = new String ( buffer ,0 , paquet . getLength ());
System . out . println ( " Paquet reu : " + s );
}

M. Belguidoum (UMC) Programmation rseau 40 / 46


Socket en mode datagram

Socket en mode datagram : java.net.DatagramSocket

Constructeur
DatagramSocket ( port ) socket UDP sur port
DatagramSocket () socket UDP sur port qqconque

envoi : send(DatagramPacket)
rception : receive(DatagramPacket)
Options UDP : timeOut,...
remarque : possibilit de "connecter" une socket UDP une (@IP,port)
connect ( InetAddress , int )

pas de connection relle, juste un contrle pour restreindre les


send/receive

M. Belguidoum (UMC) Programmation rseau 41 / 46


Socket en mode datagram

Socket en mode datagram : java.net.DatagramPacket

Constructeur
DatagramPacket ( byte [] buf , int length )
DatagramPacket ( byte [] buf , int length , InetAddress , port )

getPort() : port de l'metteur pour une rception ou port du


rcepteur pour une mission
getAddress() : idem adresse
getData() : les donnes reues ou envoyer
getLength() : idem taille

M. Belguidoum (UMC) Programmation rseau 42 / 46


Socket en mode multicast

Socket en mode multicast

Muslticast IP : Diusion de messages vers un groupe de destinataires


messages mis sur une adresse
messages reus par tous les rcepteurs "coutant" sur cette adresse
plusieurs metteurs possibles vers la mme adresse
les rcepteurs peuvent rejoindre/quitter le groupe tout instant
l'adresse IP de classe D (de 224.0.0.1 239.255.255.255)
indpendante de la localisation des metteurs/rcepteurs
Mme proprits que UDP : taille des messages limite 64 K, perte
de messages possible, pas de contrle de ux, ordre des messages non
garanti,pas de connexion

M. Belguidoum (UMC) Programmation rseau 43 / 46


Socket en mode multicast

Socket en mode multicast

M. Belguidoum (UMC) Programmation rseau 44 / 46


Socket en mode multicast

Socket en mode multicast


API : java.net.MulticastSocket
Constructeur
MulticastSocket ( port ) sur # port
MulticastSocket () sur port qqconque
( + ... )

envoi : send(DatagramPacket)
rception : receive(DatagramPacket)
se lier un groupe : joinGroup(InetAddress)
quitter un groupe : leaveGroup(InetAddress)
Limiter la porte des messages multicast : en xant le TTL
(setTimeToLive(int), le nombre de routeurs que le paquet peut
traverser avant d'tre arrt
0 : ne dpasse pas la machine
1 : ne dpasse pas le rseau local
127 : monde entier
M. Belguidoum (UMC) Programmation rseau 45 / 46
Conclusion

Bibliographie

APPRENTISSAGE DU LANGAGE JAVA, Serge Tah - ISTIA -


Universit d'Angers, juin 2002
bas sur les cours de : Gal Thomas, Lionel Seinturier, Karima
Boudaoud, etc.
Kenneth L. Calvert, Michael J. Donahoo, TCP/IP Sockets in Java,
pratical for programmers
tutorial socket : http://java.sun.com/docs/books/tutorial/
networking/sockets/index.html
la paquetage java.net :
http://download.oracle.com/javase/1.5.0/docs/api/

M. Belguidoum (UMC) Programmation rseau 46 / 46