Le mo mod` d`ele ele Cl Clie ientnt-Ser Serveu veurr La programmation sockets
Damien Pellier Damien.Pellier@math-inf
[email protected] o.univ-paris5.fr 5.fr http://www.math-info.univ-paris5.fr/~pellier/ UFR de Math´ematiques emati ques et d’Informatique d’Informa tique Univer Uni versit´ sit´e Descart Des cartes es
Plan du cours 1
Fonctionnement
2
Int´erˆets
3
Exemples
4
Acc` Ac c`es `a un service
5
G´en´eralisation du mo d`ele
6
Mise en œuvre du sch´ema ema clientclient-serve serveur ur
7
Architecture TCP/IP
8
Notion de port de connexion
9
Les sockets
10
API R´eseaux eseaux de java : paquetage java.net
Plan du cours 1
Fonctionnement
2
Int´erˆets
3
Exemples
4
Acc` Ac c`es `a un service
5
G´en´eralisation du mo d`ele
6
Mise en œuvre du sch´ema ema clientclient-serve serveur ur
7
Architecture TCP/IP
8
Notion de port de connexion
9
Les sockets
10
API R´eseaux eseaux de java : paquetage java.net
Rappels Rapp els sur le mo mod` d`ele ele ClientClient-Serveur Serveur Le client demande demand e l’ex´ecution ecution d’un service servi ce Le serveur serve ur r´ealise ealise le service servic e Client Clie nt et serveu ser veurr sont son t (en g´en´ en´eral, eral , pas n´ecessa ece ssaire iremen ment) t) locali lo calis´ s´es es sur deux deu x machines distinctes Ind´ Ind´epen ep endan dance ce inter int erfa face ce-r´ -r´ealis ealisat ation ion interface (spécification du service)
requête Client
Serveur réponse
Mod` Mo d`ele ele Cl Clie ient nt-S -Ser erve veur ur Fonctionnement
Communication par messages (plutˆot ot que par partage partag e de donn´ don n´ees, ees , m´emoire emo ire ou fichiers)
Req uˆete Requˆ ete : param`etres etr es d’app d’a ppel, el, sp´ecificat eci fication ion du servic ser vicee requis req uis R´epon ep onse se : r´esul esulta tats ts,, indi indica cate teur ur ´even eventu tuel el d’ex´ d’ex´ecut ecutio ion n ou d’er d’erre reur ur Communication synchrone (dans le mod` mo d`ele ele de base) : le client clien t est bloqu´ blo qu´e en attent att entee de la r´epons ep onsee requête exécution service
Client
réponse
Serveur
Mod`ele Client-Serveur Int´erˆets
Structuration
fonctions bien identifi´ees s´eparation interface du service - r´ealisation client et serveur peuvent ˆetre modifi´es (remplac´es) ind´ependamment
Protection
client et serveur s’ex´ecutent dans des domaines de protection diff´erents
Gestion des ressources
le serveur peut ˆetre partag´e entre de nombreux clients en contrepartie, il doit assurer la gestion des ressources partag´ees
Remarque Ces consid´erations sont ind´ependantes de la r´epartition
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Acc`es `a un service Sch´ema g´ en´eral
Annuaire des services
3. recherche
2. enregistrement
Demandeur de service
Fournisseur de service
Description 5. accès
1. création
Référence Point d'accès local
Damien Pellier (UFRMI Paris 5)
4. liaison
Le mod`ele Client-Serveur
Représentation concrète du service
7 / 46
G´en´eralisations du sch´ema client-serveur (1) Les notions de client et de serveur sont relatives
Un serveur peut faire appel ` a d !autres serveurs dont il est client Exemple usuel : traitement utilisant une base de donn´ees Serveur Fonction: applications + fonctions de services (ex: transactions, sécurité)
Client (utilisateur humain) Fonction: présentation (interface graphique)
Base de données Fonction: accès aux données
Remarque Ce cas sera trait´e en d´etail plus tard cf. Architecture `a 3 niveaux (3-tier architecture)
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Mise en œuvre du sch´ema client-serveur
Par des op´erations de
«
haut niveau
»
Utilisation d’un middleware sp´ecialis´e Contexte : langage de programmation
»
Mode non connect´e (UDP) Mode connect´e (TCP)
Par des op´erations de
bas niveau
Utilisation de primitives du syst` eme de communication Exemple : sockets
«
Appel de proc´edure ` a distance
Contexte : objets r´epartis
Appel de m´ ethodes, cr´eation d’objets ` a distance
Architecture TCP/IP Messages 5. Application
5. Application Flôts de données
4. Transport
4. Transport Datagram
3. Réseaux
Datagram 3. Réseaux
Trames 2. Liaison de données
3. Réseaux Trames
2. Liaison de données
1. Physique
2. Liaison de données
1. Physique
Internet LAN 2
LAN 1
Damien Pellier (UFRMI Paris 5)
Le mod`ele Client-Serveur
11 / 46
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
UDP : User Datagram Protocol
Transmission sans connexion (mod`ele postal) Pas de contrˆole de s´equencement
L’ordre d’arriv´ee des messages peu ˆetre diff´erent de l’ordre d’envoi.
Pas de garantie d’arriv´ee des messages
Mais les donn´ees re¸cues sont garanties non corrompues
Important : Non fiable mais rapide
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Exemple de ports de connexion Machine A http ftp
Machine B 80 20/21
telnet
23
smtp
25
https
443
Application dédiée
1345
3435
dns
53
chargen
19
Machine C
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Exemple : classe java.net.InetAddress
Exemple InetAddress adresse = n u l l ; try { i f ( args . length
>
0) {
// Appel ` a l a m´ethode s t a t i c getByName( ) adresse = InetAddress . getByName ( args [ 0 ] ) ; } else {
// Appel ` a l a m´ethode s t a t i c getLocalHost () adresse = InetAddress . getLocalHost ( ) ; }
System . out . p r i n t l n ( adresse . toString ( ) ) ; } catch ( UnknownHostException uhe ) { System . e r r . p r i n t l n ( ”Adresse inconnue” ) ; }
Socket UDP
Mode non connect´e Non fiable et r´eception non ordonn´ee Principe
Pas de circuit virtuel d´efini ` a l’avance ⇒ envoi de l’adresse destinataire L’envoyeur envoie un datagramme sur un socket que le receveur ´ecoute
Classes n´ecessaires `a la mise en œuvre :
java.net.DatagramSocket qui repr´ esente le socket local ou distant en mode
non connect´e
java.net.DatagramPacket qui repr´ esente le datagramme ` a envoyer ou re¸ cu
(tableau d’octets)
Socket UDP – cˆot´e ´emetteur
Cr´eation d’un socket DatagramSocket dgSocket = new DatagramSocket() ;
Pr´eparation des donn´ees `a ´emettre byte[] data = new byte[15] ; // ` a remplir ! data = {’H’, ’E’, ’L’, ’L’, ’O’, ’\r’, ’\n’} ; DatagramPacket paquet = new DatagramPacket(data, data.length, IPDestination, port) ;
Envoi des donn´ees dgSocket.send(paquet) ;
Socket UDP – cˆot´e r´ecepteur Cr´eation d’un socket li´e au port d’´ecoute DatagramSocket dgSocket = new DatagramSocket(port) ;
Pr´eparation du paquet de r´eception DatagramPacket data = new byte[MAX] ; // initialement vide DatagramPacket paquet = new DatagramPacket(data, data.lenght) ;
R´eception du paquet dgSocket.receive(paquet) ; // attention bloquant
Remarques L’ordre de r´ eception des paquets peut ˆetre diff´erent de celui d’´emission Pour r´ealiser un receive non bloquant (communication asynchrone) il est n´ ecessaire d’utiliser la classe java.net.DatagramChannel .
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
´ Socket TCP : Echange de donn´ees
1
R´ecup´eration des canaux d’entr´ee et de sortie
InputStream sin = socket.getInputStream() ; OutputStream sout = socket.getOutputStream() ; 2
Choix d’un type d’entr´ee – sortie particulier
Exemple DataInputStream sin = new DataInpuStream(socket.getInputStream()) ; DataOutputStream sout = new DataOutputStream(socket.getOutputStream()) ;
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
´ Socket TCP : Echange de donn´ees (suite) 1
Choix de l’encodage des carat`eres
Exemple d’encodage UTF-16 String str = ‘‘J’´ e cris dans le tyuau’’ ; // cha^ ıne a ` envoyer byte[] bytes = str.getBytes(‘‘UTF-16’’) ; // conversion de str au format UTF-16
2
Format : disponibles : US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16. Java offre une m´ethode simple pour transf´erer des chaines au format UTF-8.
Exemple : transfert d’une chaˆıne UTF-8 // c^ ot´ e e ´metteur String str = ‘‘J’´ e cris dans le tyuau’’ ; // cha^ ıne a ` envoyer sout.writeUTF(str) ; // envoi de la cha^ ıne // c^ ot´ e r´ ecepteur String str = sin.readUTF() ; // lecture de la cha^ ıne
Exemple : code client TCP Exemple import java . net . ∗ ; import java . i o . ∗ ; p ub li c c l a s s TCPClientEcho { p ub li c s t a t i c v oi d main ( String [ ] args ) { String adrServ = args [ 0 ] ; i n t portServ = Integer . parseInt ( args [ 1 ] ) ;
// Connexion avec le cl av ie r BufferedReader cin = new BufferedReader ( new InputStreamReader ( System . i n ) ) ; try {
// Ouverture socket et demande de connexion Socket socket = new Socket ( adrServ , portServ ) ; // Connexion au canal de r´e ce pti on DataInputStream si n = new DataInputStream ( socket . getInputStream ( ) ) ;
Exemple : code client TCP
Exemple (suite) // Connexion au canal d ’ ´e missi on DataOutputStream sou t = new DataOutputStream ( socket . getOutputStream ( ) ) ; boolean stop = f a l s e ; while ( ! stop ) {
// S a i s i e c l a v i e r bl oquant e System . out . p r i n t ( ”Entrer une phrase : ” ) ; S t ri n g l i g n e = cin . readLine ( ) ; i f ( l i g n e . equalsIgnoreCase ( ”FIN” ) ) { stop = true ; // s i f i n i a lo r s s o r t i r sout . writeUTF ( ”FIN” ) ; // envoi FIN au serveur
Exemple : code client TCP
Exemple (suite) e es au ser veu r } e l s e { // Sinon , envoi des donn´ sout . writeUTF ( l i g n e ) ; // Lecture du canal de r´ e ception et affi chage System . out . p r i n t l n ( ”Echo : ” + s i n . readUTF ( ) ) ; } } } catch ( UnknownHostException uhe ) { System . e r r . p r i n t l n ( uhe ) ; } catch ( IOException ioe ) { System . e r r . p r i n t l n ( i oe ) ; } } }
Les types de serveurs On peut classer les serveurs en deux types distincts : 1 Les serveurs it´eratifs : les requˆetes sont trait´ees les unes apr`es les autres par un seul Thread. 2 Les serveurs concurrents : les diff´erentes requˆetes sont trait´ees de mani`ere concurrentes, chacune n´ecessitant la cr´eation d’un Thread d´edi´e `a son traitement.
Avantages Les serveurs it´eratifs sont plus simples `a mettre en œuvre : il n’est pas n´ecessaire de synchroniser l’ex´ecution concurrente des diff´erents Thread.
Inconv´enients Les temps de r´eponses des serveurs it´ eratifs sont plus importants : un seul client trait´e `a la fois.
Le serveur it´eratif Client
Serveur Itératif
Initialisation
Initialisation
Demande de connexion
Écoute des connexions File d'attente des connexions
Envoi de requêtes
Réception réponse
fermeture socket
Fin
Traitement des requêtes en utilisant le socket de transfert
fermeture socket de transfert
Exemple : code serveur TCP
Exemple import java . net . ∗ ; import java . i o . ∗ ; p ub li c c l a s s TCPServeurEcho { p ub li c s t a t i c v oi d main ( String [ ] args ) { i n t portServ = Integer . parseInt ( args [ 0 ] ) ; ServerSocket listenSocket = n u l l ; try {
// Cr´ e ation d ’une connexion pas si ve listenSocket = new ServerSocket ( portServ ) ;
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Exemple : code serveur TCP
Exemple (suite) p r iv a te s t a t i c v oid doService ( Socket socket ) throws IOException {
// Connexion au flu x en lect ure DataInputStream si n = new DataInputStream ( socket . getInputStream ( ) ) ; // Connexion au fl ux en ´e c ri tu re DataOutputStream sou t = new DataOutputStream ( socket . getOutputStream ( ) ) ;
Exemple : code serveur TCP
Exemple (suite) // Renvoi des donn´ e es re¸c ues (readLine est bloquant) boolean stop = f a l s e ; while ( ! stop ) { Stri ng msg = s i n . readUTF ( ) ; i f ( msg . equals ( ”FIN” ) ) { stop = true ; } else {
sout . writeUTF ( msg ) ; // Envoi echo } } }
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Exemple : boucle principale du serveur TCP concurrent Exemple try {
// Cr´ e ation d ’une connexion pas si ve listenSocket = new ServerSocket ( portServ ) ; // Attente de connexion cl ie nt System . out . p r i n t l n ( ”Attente connexion . . . . ” ) ; while ( true ) {
// Acceptation des connexions cl ie nt Socket transferSocket = listenSocket . accept ( ) ; // R´ e alise le serv ice pour chaque cl ie nt // Acc` e s co nc ur re nt S e rv i ce s e r v i c e = new Service ( transferSocket ) ; service . start ( ) ; } } catch ( IOException ioe ) { System . e r r . p r i n t l n ( i oe ) ; }
Exemple : code de traitement Exemple import java . lang . ∗ ; import java . net . ∗ ; import java . i o . ∗ ; p ub li c c l a s s Service extends Thread { private Socket socket ; // La s oc ke t c l i e n t public Service ( Socket socket ) { // Construteur du serv ice t h i s . socket = socket ; } p u b l i c v oi d run ( ) { // M´ e thode impl´ e mentant l e s e r v i c e t r y { // Connexion au flu x en lect ure DataInputStream si n = new DataInputStream ( t h i s . socket . getInputStream ( ) ) ;
// Connexion au fl ux en ´e c ri tu re DataOutputStream sou t = new DataOutputStream ( t h i s . socket . getOutputStream ( ) ) ;