client/serveur
java.net
Communications
Communications sur
sur Internet
Internet
1
Applications
Applications réseau
réseau Java
Java
Application Java Applications
java.net HTTP, ftp, telnet, …
IP, …
Couche de base
Object Device driver
Couche Physique
Ethernet, …
InetAdress
Socket ServerSocket
DatagramSocket DatagramPacket
URL URLConnection
Sockets
Sockets et
et applications
applications Client/Serveur
Client/Serveur
1) Le programme serveur tourne sur une machine hôte spécifique
port
Serveur
Serveur Client
Client
Serveur
Serveur connexion Client
Client numéro de port auquel est connecté
le serveur
Client
Client
port
Serveur
Serveur
ion
ex
Attribution d’un nouveau socket (et 2 flots de données sont établis entre les deux machines :
d’un nouveau numéro de port) Le client et le serveur peuvent communiquer en écrivant ou en
lisant dans leur socket
2
Sockets
Sockets TCP
TCP dans
dans java.net
java.net
ServerSocket
Encapsule le socket du serveur
Socket
Encapsule le socket du client
Client
Client // Serveur
Serveur avec
avec java.net
java.net :: principe
principe
(1) Le serveur
enregistre
son service
Serveur Le client doit être démarré après le serveur.
Si le serveur n’a pas encore démarré, levée
d’une exception après un time-out
ServerSocket svs =
(2) Le serveur se new ServerSocket(port#)
met en attente de Client (3) Etablir la
connexion connexion
svs.accept() Socket sc =
new Socket(host, port#)
Sortie de accept
retour d’un objet
Socket
(4) Utilisation
(4) Utilisation Socket s = du socket
du socket
InputStream OutputStream
socket Canal TCP socket
OutputStream InputStream
(5’) Fermer la
connexion (5) Fermer la
s.close() connexion
sc.close()
(6) Fermer le
sv.close()
service
close() ferme (détruit) le socket côté
client comme côté serveur
3
Echanges
Echanges entre
entre client
client et
et serveur
serveur
Pour échanger des données le serveur et le client utilisent les flux d’entrée/sortie
fournis par leur socket :
Un objet java.io.InputStream pour la lecture retourné par la méthode
getInputStream() de Socket
Un objet java.io.OutputStream pour l’écriture retourné par la méthode
getOutputStream() de Socket
Echanges
Echanges en
en mode
mode ligne
ligne
Attention :
Variation des terminateurs de ligne selon les OS
LF '\n' , CR '\r' , CRLF '\r' '\n'
4
Echanges
Echanges en
en mode
mode ligne
ligne
Le flux d’entrée
Echanges
Echanges en
en mode
mode ligne
ligne
Le flux de sortie
writer.flush();
5
Echanges
Echanges en
en mode
mode bloc
bloc de
de données
données
Protocole
Protocole d’échange
d’échange
6
Classes
Classes d’exceptions
d’exceptions de
de java.net
java.net
C Coté client
Principales classes d’exceptions de java.net S Coté serveur
java.lang.Exception
C S
Erreur du protocole TCP/IP
(problème de configuration
Problème générique de java.io.IOException De la pile TCP/IP)
connexion)
C S
SocketException ProtocolException
UnknownHostException
ConnectException
Servir
Servir plusieurs
plusieurs clients
clients
Ne permet de servir qu’un
ServeurSocket sSock = new ServeurSocket(4444); seul client
Socket s = sSock.accept();
// création d’une socket quand un demande de connexion a été acceptée
Socket s = sSock.accept();
// création d’une socket quand un demande de connexion a été acceptée
7
Serveur
Serveur Multithreadé
Multithreadé
ServeurSocket sSock = new ServeurSocket(4444);
boolean arretServeur = false;
while (! arretServeur) {
Socket s = sSock.accept();
// création d’une socket quand un demande de connexion a été acceptée
Thread dispatcher
Attente demande
de connexion
Récupération de la socket
Dédiée à la connexion Thread de service Client 1
Création et lancement
d’un thread de service Prise en
Prise en charge du
Prise en charge
du
charge du
dialogue
dialogue avec le client 1
dialogue avec
avec le
le client
client 1
1
Attente demande
de connexion
Récupération de la socket
Dédiée à la connexion
Thread de service Client 2
Création et lancement
d’un thread de service
Prise
Prise en
dialogue
en charge
charge du
dialogue avec
avec le
du
le client
client
Attente demande
de connexion
…
© Philippe GENOUD UJF Décembre 2004 15
Serveur
Serveur Multithreadé
Multithreadé
...
ServeurSocket sSock = new ServeurSocket(4444);
boolean arretServeur = false;
while (! arretServeur) {
...
<interface> ServiceClient
Runnable
+ ServiceClient(Socket s)
+ run()
+ run()
Le traitement du
client
8
Client
Client Multitread
Multitread
public class ServiceClient implements Runnable {
private Socket s;
private BufferedReader in;
private PrintWriter out;
private boolean termine = false;
... Création des flux
d’entrée/sortie
public ServiceClient(Socket s) {
pour communiquer
this.s = s;
in = new BufferedReader( avec le serveur
new InputStreamReader((s.getInputStream()));
out = new PrintWriter(s.getOutputStream());
...
}
...
}
© Philippe GENOUD UJF Décembre 2004 17
Exercice
Exercice