Beruflich Dokumente
Kultur Dokumente
La programmation sockets
Damien Pellier
Damien.Pellier@math-info.univ-paris5.fr http://www.math-info.univ-paris5.fr/~pellier/
UFR de Math ematiques et dInformatique Universit e Descartes
1 / 46
Plan du cours
1 2 3 4 5 6 7 8 9 10
Fonctionnement Int er ets Exemples Acc` es ` a un service G en eralisation du mod` ele Mise en uvre du sch ema client-serveur Architecture TCP/IP Notion de port de connexion Les sockets API R eseaux de java : paquetage java.net
2 / 46
3 / 46
Communication par messages (plut ot que par partage de donn ees, m emoire ou chiers)
Requ ete : param` etres dappel, sp ecication du service requis R eponse : r esultats, indicateur eventuel dex ecution ou derreur Communication synchrone (dans le mod` ele de base) : le client est bloqu e en attente de la r eponse
requte excution service
Client
rponse
Serveur
4 / 46
Structuration
fonctions bien identi ees s eparation interface du service - r ealisation client et serveur peuvent etre modi es (remplac es) ind ependamment
Protection
client et serveur sex ecutent dans des domaines de protection di erents
Remarque
Ces consid erations sont ind ependantes de la r epartition
5 / 46
Exemples dapplications
Serveur de chiers (AFS, NFS) Serveur dimpression (lpd) Serveur de calcul Serveur dapplication (sp ecique ` a lapplication) Serveur de bases de donn ees Serveur de temps Serveur de noms (annuaire des services)
6 / 46
Acc` es ` a un service
Sch ema g en eral
3. recherche
2. enregistrement
Fournisseur de service
7 / 46
Remarque
Ce cas sera trait e en d etail plus tard cf. Architecture ` a 3 niveaux (3-tier architecture)
Damien Pellier (UFRMI Paris 5) Le mod` ele Client-Serveur 8 / 46
9 / 46
10 / 46
Architecture TCP/IP
Messages 5. Application Flts de donnes 4. Transport Datagram 3. Rseaux Trames 2. Liaison de donnes 2. Liaison de donnes 3. Rseaux Trames 2. Liaison de donnes Datagram 3. Rseaux 4. Transport 5. Application
1. Physique
1. Physique
11 / 46
Gestion du s equencement i.e., ordonnancement des messages Gestion des ux an d eviter lenvoi de paquets irrecevables par le destinataire (ex : gestion des buers au niveau r ecepteur et emetteur) Liaison full-duplex (virtuellement) Orient e ux de donn ees
Important :
Connexion able de bout en bout mais lente
12 / 46
Transmission sans connexion (mod` ele postal) Pas de contr ole de s equencement
Lordre darriv ee des messages peu etre di erent de lordre denvoi.
Important :
Non able mais rapide
13 / 46
Permet davoir sur une m eme machine plusieurs services accessibles simultan ement (web, email, ftp, etc.) Adressage r ealis e en sappuyant sur le couple @machine , port . Par exemple :
@machine , 80 HTTP @machine , 20/21 FTP @machine , 23 TELNET
14 / 46
Le port 0 est un port r eserv e sp ecial Certaines applications r eservent des ports en zone utilisteurs ex : X11 se r eserve le port 6000
Ports utilisateurs
65536
15 / 46
Machine B
1345
Machine C
16 / 46
Les sockets
Les sockets d enissent une interface entre les programmes dapplications et les couches r eseaux. Le terme de socket (embout) d esigne aussi un canal de communication par lequel un processus peut envoyer ou recevoir des donn ees LAPI (Application Program Interface) socket de JAVA est proche de lAPI chier UNIX :
Primitives douverture/fermeture, lecture/ ecriture, de contr ole
Histoire
1982 : BSD impl emente une interface Socket 1992 : Winsock de Trumpet pour windows
17 / 46
Adresse IP
classe InetAddress
Socket TCP
classe Socket, classe SocketServer
Socket UDP
classe DatagramSocket, class DatagramPacket
Multicast
classe MulticastSocket
18 / 46
Classe java.net.InetAddress
Sous classe :
Inet4address, Inet6Address
19 / 46
Exemple
InetAddress adresse = n u l l ; tr y { 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 ) ; }
20 / 46
Socket UDP
21 / 46
22 / 46
R eception du paquet
dgSocket.receive(paquet) ; // attention bloquant
Remarques
Lordre de r eception des paquets peut etre di erent de celui d emission Pour r ealiser un receive non bloquant (communication asynchrone) il est n ecessaire dutiliser la classe java.net.DatagramChannel.
23 / 46
Exemple
import java . net . ; import java . i o . ; public c l a s s UDPClientEcho { public s t a t i c void main ( String [ ] args ) { tr y { InetAddress adrServ = InetAddress . getByName ( args [ 0 ] ) ; i n t portServ = I n t e g e r . p a r s e I n t ( args [ 1 ] ) ; // Connexion avec l e c l a v i e r DataInputStream c i n = new DataInputStream ( System . i n ) ; // Cr e ation du socket UDP DatagramSocket dgSocket = new DatagramSocket ( ) ; boolean stop = f a l s e ; while ( ! stop ) { System . out . p r i n t ( Entrer une phrase : ) ; String l i g n e = c i n . readLine ( ) ; // l e c t u r e c l a v i e r
24 / 46
25 / 46
Exemple
import java . net . ; import java . i o . ; public c l a s s UDPServeurEcho { // Longueur max des paquets en r e ception f i n a l s t a t i c i n t LG MAX = 1 0 2 4 ; // Buffer de r e ception f i n a l s t a t i c byte [ ] b u f f e r = new byte [ LG MAX ] ; public s t a t i c void i n t portServ = tr y { // Cr e ation du DatagramSocket main ( String [ ] args ) { I n t e g e r . p a r s e I n t ( args [ 0 ] ) ; socket d e coute dgSocket = new DatagramSocket ( portServ ) ;
26 / 46
27 / 46
Socket TCP
28 / 46
Client
Serveur Cration ServeurSocket liaison avec le port TCP Attente d'une demande de connexion
29 / 46
attendant une demande connexion sur le socket d ecoute acceptant la demande de connexion Les transferts peuvent dor enavant etre eectu es en utilisant le socket de transfert
30 / 46
Exemple
DataInputStream sin = new DataInpuStream(socket.getInputStream()) ; DataOutputStream sout = new DataOutputStream(socket.getOutputStream()) ;
31 / 46
32 / 46
Java ore une m ethode simple pour transf erer des chaines au format UTF-8.
33 / 46
Exemple
import java . net . ; import java . i o . ; public c l a s s TCPClientEcho { public s t a t i c void main ( String [ ] args ) { String adrServ = args [ 0 ] ; i n t portServ = I n t e g e r . p a r s e I n t ( args [ 1 ] ) ; // Connexion avec l e c l a v i e r BufferedReader c i n = new BufferedReader ( new InputStreamReader ( System . i n ) ) ; tr y { // Ouverture socket et demande de connexion Socket socket = new Socket ( adrServ , portServ ) ; // Connexion au canal de r e ception DataInputStream s i n = new DataInputStream ( socket . getInputStream ( ) ) ;
34 / 46
Exemple (suite)
// Connexion au canal d e mission DataOutputStream sout = 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 bloquante System . out . p r i n t ( Entrer une phrase : ) ; String l i g n e = c i n . readLine ( ) ; i f ( l i g n e . equalsIgnoreCase ( FIN ) ) { stop = true ; // s i f i n i a l o r s s o r t i r sout . writeUTF ( FIN ) ; // envoi FIN au serveur
35 / 46
Exemple (suite)
} e l s e { // Sinon , envoi des donn e es au serveur sout . writeUTF ( l i g n e ) ;
36 / 46
Les serveurs concurrents : les di erentes requ etes sont trait ees de mani` ere concurrentes, chacune n ecessitant la cr eation dun Thread d edi e` a son traitement.
Avantages
Les serveurs it eratifs sont plus simples ` a mettre en uvre : il nest pas n ecessaire de synchroniser lex ecution concurrente des di erents Thread.
Inconv enients
Les temps de r eponses des serveurs it eratifs sont plus importants : un seul client trait e` a la fois.
37 / 46
Le serveur it eratif
Client
Initialisation
Serveur Itratif
Initialisation
Demande de connexion
Envoi de requtes
Rception rponse
fermeture socket
Fin
38 / 46
Exemple
import java . net . ; import java . i o . ; public c l a s s TCPServeurEcho { public s t a t i c void main ( String [ ] args ) { i n t portServ = I n t e g e r . p a r s e I n t ( args [ 0 ] ) ; ServerSocket l i s t e n S o c k e t = n u l l ; tr y { // Cr e ation d une connexion p a s s i v e l i s t e n S o c k e t = new ServerSocket ( portServ ) ;
39 / 46
Exemple (suite)
// Attente de connexion c l i e n t while ( true ) { // Acceptation des connexions c l i e n t System . out . p r i n t l n ( Attente connexions . . . ) ; Socket transferSocket = l i s t e n S o c k e t . accept ( ) ; // R e a l i s e l e s e r v i c e pour chaque c l i e n t // Acc` e s s e q u e n t i e l (un c l i e n t s e r v i ` a la fois ) doService ( transferSocket ) ;
} } catch ( IOException i o e ) { System . e r r . p r i n t l n ( i o e ) ; }
40 / 46
Exemple (suite)
private s t a t i c void doService ( Socket socket ) throws IOException { // Connexion au f l u x en l e c t u r e DataInputStream s i n = new DataInputStream ( socket . getInputStream ( ) ) ; // Connexion au f l u x en ecriture DataOutputStream sout = new DataOutputStream ( socket . getOutputStream ( ) ) ;
41 / 46
Exemple (suite)
// Renvoi des donn e es re c ues ( readLine e s t bloquant ) boolean stop = f a l s e ; while ( ! stop ) { String msg = s i n . readUTF ( ) ; i f ( msg . equals ( FIN ) ) { stop = true ; } else { sout . writeUTF ( msg ) ; // Envoi echo
} } }
42 / 46
Le serveur concurrent
Client
Initialisation
Serveur Concurrent
Initialisation
Demande de connexion
thread p0
Rception rponse
fermeture socket
43 / 46
44 / 46
public void run ( ) { // M ethode impl e mentant l e s e r v i c e tr y { // Connexion au f l u x en l e c t u r e DataInputStream s i n = new DataInputStream ( t h i s . socket . getInputStream ( ) ) ; // Connexion au f l u x en ecriture DataOutputStream sout = new DataOutputStream ( t h i s . socket . getOutputStream ( ) ) ;
45 / 46
Exemple
// Renvoi des donn e es re c ues ( readLine e s t bloquant ) boolean stop = f a l s e ; while ( ! stop ) { String msg = s i n . readUTF ( ) ; i f ( msg . equals ( FIN ) ) { stop = true ; } else { sout . writeUTF ( msg ) ; // Envoi echo
} } } catch ( IOException e ) { System . e r r . p r i n t l n ( e ) ; } } }
46 / 46