Le modèle client -serveur
Introduction
Chris tia n Bulfone
chris tia n.bulfone @ gips a -la b.fr
www.gips a -la b.fr/~chris tia n.bulfone /
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Encapsulation : rappel
Données (+PAD) Adresse
Source Adresse
Destination Type FCS
En-tête IP Données Données
En-tête UDP
Données
Données En-tête
TCP
Données
Application
Transport
Paquet UDP Segment TCPInternet
Datagramme IP
Accès réseau
Trame (Ethernet)veur – Master IC2A/DCISS – Christian Bulfone
Les applications réseau
• Les applications sont la raison d’être des réseaux informatiques
• Partie visible pour l’utilisateur
• Développement considérable de leur nombre depuis les débuts d’Internet
• Ont évolué au fil des années
• Sous forme textuelle au tout début : messagerie
électronique, accès aux terminaux distants, transfert de fichiers …
• Multimédia aujourd’hui : diffusion radio/vidéo à la demande (podcasting), visioconférence, téléphonie sur IP (VoIP) …
• Sont basées sur la communication entre 2 entités
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Principe du client / serveur
• Repose sur une communication d’égal à égal entre les applications
• Communication réalisée par dialogue entre processus deux à deux
• un processus client
• un processus serveur
• Les processus ne sont pas identiques mais forment plutôt un système coopératif se traduisant par un échange de données
• le client réceptionne les résultats finaux délivrés par le serveur
• Le client initie l’échange
• Le serveur est à l’écoute d’une requête cliente éventuelle
• Le service rendu = traitement effectué par le serveur
veur – Master IC2A/DCISS – Christian Bulfone
Serveur
• Un programme serveur
• tourne en permanence, attendant des requêtes
• peut répondre à plusieurs clients en même temps
• Nécessite
• une machine robuste et rapide, qui fonctionne 24h/24
• alimentation redondante, technologie RAID …
• la présence d’administrateurs systèmes et réseau
pour gérer les serveurs
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Avantages du client / serveur
• Unicité de l'information (non dupliquée)
• Meilleure sécurité
• un faible nombre de points d’entrée pour accéder aux données (meilleur contrôle, ex: serveur impression)
• Meilleure fiabilité
• les clients ne sont pas des ressources critiques
• seul l’est le serveur (clients interchangeables)
• Facilité d'évolution
• il est très facile de rajouter ou d'enlever des clients, et
même des serveurs
veur – Master IC2A/DCISS – Christian Bulfone
Exemples
• Serveur de fichiers (NFS, SMB)
• Serveur d’impression (lpd, CUPS)
• Serveur de calcul
• Serveur d’applications
• Serveur de bases de données
• Serveur de temps
• Serveur de noms (annuaire des services)
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Le modèle client / serveur
• Le client de ma nde l’e xé cution d’un s e rvice
• Le serveur ré a lis e le s e rvice
• Clie nt e t s e rve ur s ont gé né ra le me nt loca lis é s s ur de ux ma chine s dis tincte s (il s ’a git pa rfois de la mê me
ma chine )
client
requête
réponse
serveur
veur – Master IC2A/DCISS – Christian Bulfone
Le modèle client / serveur
• Communication par messages
• Requête : paramètres d’appel, spécification du service requis
• Réponse : résultats, indicateur éventuel d’exécution ou d’erreur
• Communication synchrone (dans le modèle de base) : le client est bloqué en attente de la réponse
Client Serveur
requête
réponse
exécution
du service
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Gestion des processus
• Client et serveur exécutent des processus distincts
• Le client est suspendu lors de l’exécution de la requête (appel synchrone)
• Plusieurs requêtes peuvent être traitées par le serveur
mode ité ra tif
mode concurre nt
veur – Master IC2A/DCISS – Christian Bulfone
Gestion des processus
• Mode de gestion des requêtes
itératif
• le proce s s us s e rve ur tra ite le s re quê te s le s une s a prè s le s a utre s
concurrent ba s é s ur
• pa ra llé lis me ré e l
• s ys tè me multiproce s s e urs pa r e xe mple
• ps e udo-pa ra llé lis me
• s ché ma ve ille ur-e xé cuta nts
• la concurre nce pe ut pre ndre plus ie urs forme s
• plus ie urs proce s s us (une mé moire virtue lle pa r proce s s us )
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Gestion des processus dans le serveur
• Processus serveur unique
while (true) {
receive (client_id, message)
extract (message, service_id, params) do_service[service_id] (params, results) send (client_id, results)
}
traitement
requêtes
réponse
sélection
veur – Master IC2A/DCISS – Christian Bulfone
Gestion des processus dans le serveur
• Schéma veilleur-exécutants
while (true) {
receive (client_id, message)
extract (message, service_id, params) p = create_thread (client_id, service_id, params)
}
programme de p
do_service[service_id] (params, results) send (client_id, results)
exit
sélection
création
pProcessus veilleur Création dynamique des
exécutants
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Mise en œuvre du modèle client / serveur
• Besoin d’un support pour transporter les informations entre le client et le serveur
• Bas niveau
• Utilisation directe du transport : sockets (cons truits s ur TCP ou UDP )
• Ha ut nive a u
• Inté gra tion da ns le la nga ge de progra mma tion : RP C ou Remote Procedure Call (cons truits s ur s ocke ts )
• Né ce s s ité d’é ta blir un protocole e ntre le clie nt e t le
s e rve ur pour qu’ils s e compre nne nt
veur – Master IC2A/DCISS – Christian Bulfone
Exemple de client / serveur
• Un serveur de fichiers
• Des clients qui demandent des fichiers
• Comment gérer la concurrence ?
• un processus serveur ⇔ un clie nt s e rvi
• plus ie urs clie nts ⇒ plus ie urs proce s s us s e rve ur
• Que l protocole utilis e r ?
• le clie nt e nvoie le nom du fichie r
• le s e rve ur re nvoie la ta ille puis le s donné e s
• comme nt gè re -t-on le s e rre urs ?
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Les protocoles applicatifs
• Le protocole applicatif définit
• Le format des messages échangés entre émetteur et récepteur (textuel, binaire, …)
• Les types de messages : requête / réponse / informationnel …
• L’ordre d’envoi des messages
• Ne pas confondre protocole et application
• Une application peut supporter plusieurs protocoles (ex : logiciel de messagerie supportant POP, IMAP et SMTP)
• Navigateur et serveur Web s’échangent des
documents HTML en utilisant le protocole HTTP
veur – Master IC2A/DCISS – Christian Bulfone
Les sockets
• API ( Application Program Interface ) s ocke t
• mé ca nis me d'inte rfa ce de progra mma tion de s s ocke ts
• pe rme t a ux progra mme s d'é cha nge r de s donné e s
• le s a pplica tions clie nt/s e rve ur ne voie nt le s couche s de communica tion qu’à tra ve rs l’AP I s ocke t (a bs tra ction)
• n'implique pa s forcé me nt une communica tion pa r le ré s e a u
• le te rme « s ocke t » s ignifie douille , pris e é le ctrique fe me lle , bre f ce s ur quoi on bra nche que lque chos e
• L’AP I s ocke t s ’a pproche de l’AP I fichie r d’Unix
• Dé ve loppé e à l’origine da ns Unix BS D ( Berkeley
Software Distribution )
e client-serveur – Master IC2A/DCISS – Christian Bulfone
L’API socket
accès réseau Application
cliente
IP TCP UDP
API socket
ICMP
protocole applicatif
réseau IP
accès réseau Application
serveur
IP TCP UDP
API socket
ICMP
veur – Master IC2A/DCISS – Christian Bulfone
Les sockets
• Avec les protocoles UDP et TCP, 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
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Notion de port
• Un service rendu par un programme serveur sur une machine est accessible par un port
• Un port est identifié par un entier (16 bits)
• de 0 à 1023
• ports reconnus ou réservés
• sont assignés par l'IANA ( Internet Assigned Numbers Authority )
• donne nt a ccè s a ux s e rvice s s ta nda rd : courrie r (S MTP port 25), s e rve ur we b (HTTP port 80) …
• > 1024
• ports « utilisateurs » dis ponible s pour pla ce r un s e rvice a pplica tif que lconque
• Un s e rvice e s t s ouve nt connu pa r un nom (FTP, ...)
• La corre s ponda nce e ntre nom e t numé ro de port e s t donné e
pa r le fichie r /etc/services
veur – Master IC2A/DCISS – Christian Bulfone
Identification des protocoles
HTTP SMTP SSH DNS SNMP DHCP
TCP UDP
IP
ICMP ARP
port=80 port=25 port=22 port=53 port=161 port=67/68
proto=6 proto=17
proto=1
type=0x800 type=0x806
…
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Les sockets
@ IP : 192.168.20.1 @ IP : 192.168.20.2
Couche Réseau (IP)
@ Ethernet Couche Liaison @ Ethernet
n° port : 2345
@ IP : 192.168.20.1
Couche Transport (TCP, UDP) n° port : 80
@ IP : 192.168.20.2
Client Serveur
Couches Session à Application
processus serveur processus
client
veur – Master IC2A/DCISS – Christian Bulfone
Principes de fonctionnement (mode concurrent)
Le s e rve ur cré e une « s ocke t s e rve ur » (a s s ocié e à un port) e t s e me t e n a tte nte
Le clie nt s e conne cte à la s ocke t s e rve ur
• De ux s ocke ts s ont a lors cré é s
• Une « s ocke t clie nt » côté clie nt
• Une « s ocke t s e rvice clie nt » côté s e rve ur
• Ce s s ocke ts s ont conne cté e s e ntre e lle s
« socket serveur » 80
« socket serveur » 80
4321 2345
« socket service client »
« socket client »
serveur
client
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Gestion du parallèlisme sur le serveur
• Utilisation d’un seul processus serveur
• Les clients multiples sont traités en séquence
• les requêtes sont conservées dans une file d’attente associée à la socket serveur
• La longueur maximale de cette file d’attente peut être spécifiée lors de la création de la socket serveur (en Java)
Client 1
Client 2
sélection
Client 3
socket service client requêtes
file d’attente socket serveur
veur – Master IC2A/DCISS – Christian Bulfone
Gestion du parallèlisme sur le serveur
• Utilisation du schéma veilleur-exécutants
• Le thread ve ille ur doit cré e r e xplicite me nt un nouve a u thread e xé cuta nt à cha que nouve lle conne xion d’un clie nt (donc à l’e xé cution de a cce pt())
• Une « s ocke t s e rvice clie nt » diffé re nte e s t cré é e pour cha que clie nt
• Le thread ve ille ur s e re me t e ns uite e n a tte nte
while (true) {
accepter la connexion d’un nouveau client et créer une socket service client;
Client 1 créer
socket serveur
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Mode connecté / non connecté
• Deux réalisations possibles
• Mode connecté (protocole TCP)
• Mode non connecté (protocole UDP)
• Mode connecté
• Ouverture d’une liaison, suite d’échanges, fermeture de la liaison
• Le serveur préserve son état entre deux requêtes
• Garanties de TCP : ordre, contrôle de flux, fiabilité
• Adapté aux échanges ayant une certaine durée (plusieurs
messages)
veur – Master IC2A/DCISS – Christian Bulfone
Mode connecté / non connecté
• Les requêtes successives sont indépendantes
• Pas de préservation de l’état du serveur entre les requêtes
• Le client doit indiquer son adresse à chaque requête (pas de liaison permanente)
• Pas de garanties particulières (UDP)
• gestion de toutes les erreurs à la main : il faut réécrire la couche transport !!!
• Adapté
• aux échanges brefs (réponse en 1 message)
• pour faire de la diffusion
• Mode non connecté
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Mode connecté / non connecté
• Le client a l’initiative de la communication
• le serveur doit être à l’écoute
• Le client doit connaître la référence du serveur (adresse IP, numéro de port)
• en la trouvant dans un annuaire, si le serveur l’y a enregistrée au préalable
• en utilisant les numéros de ports préaffectés par convention
• Le serveur peut servir plusieurs clients
• Points communs
veur – Master IC2A/DCISS – Christian Bulfone
Utilisation du mode connecté
• Caractéristiques
• Établissement préalable d’une connexion (circuit virtuel) : le client demande au serveur s’il accepte la connexion
• Fiabilité assurée par le protocole (TCP)
• Mode d’échange par flots d’octets : le récepteur n’a pas
connaissance du découpage des données effectué par l’émetteur
• Possibilité d’émettre et de recevoir des caractères urgents
• Après initialisation, le serveur est « passif » : il est activé lors de l’arrivée d’une demande de connexion du client
• Un serveur peut répondre aux demandes de service de plusieurs clients : les requêtes arrivées et non traitées sont stockées dans une file d’attente
• Contraintes
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Utilisation du mode non connecté
• Caractéristiques
• Pas d’établissement préalable d’une connexion
• Pas de garantie de fiabilité
• Adapté aux applications pour lesquelles les réponses aux requêtes des clients sont courtes (1 message)
• Le récepteur reçoit les données selon le découpage effectué par l’émetteur
• Contraintes
• Le client doit avoir accès à l’adresse du serveur (adresse IP, numéro de port)
• Le serveur doit récupérer l’adresse de chaque client pour lui
répondre
veur – Master IC2A/DCISS – Christian Bulfone
Généralisation du schéma client / serveur
• Les notions de client et de serveur sont relatives
• Un serveur peut faire appel à d’autres serveurs dont il est le client
• Architecture à 3 niveaux
• Exemple : un serveur Web faisant appel à un serveur de base de données
• Clients et serveurs jouent parfois un rôle symétrique
• Exemple : postes des réseaux Microsoft Windows
• Systèmes de pair à pair (Peer to Peer, P2P)
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Format de représentation des données
• TCP/IP spécifie une représentation normalisée pour les entiers utilisés dans les protocoles
• appelée Network Byte Order
• re pré s e nte le s e ntie rs a ve c le MS B (Mos t S ignifica nt Bit) e n pre mie r
• Une a pplica tion doit re ns e igne r ce rta ine s informa tion du protocole e t pa r cons é que nt, doit re s pe cte r le Network informations Byte Order
• Exe mple le numé ro de port
• Le s a pplica tions doive nt tra ns la te r la re pré s e nta tion de s donné e s de la ma chine loca le ve rs le Network Byte Order
• pe rme t a ins i à de ux a pplica tions tourna nt s ur de s pla te forme s
diffé re nte s de communique r e ns e mble
L’API Socket en Java
e client-serveur – Master IC2A/DCISS – Christian Bulfone
L’API socket en Java
• L'interface Java des sockets (package java.net) offre un accès simple aux sockets sur IP
• Plusieurs classes interviennent lors de la réalisation d'une communication par sockets
• La classe java.net.InetAddress permet de manipuler des adresses IP
• Mode connecté (TCP)
• La classe java.net.SocketServer permet de programmer l'interface côté serveur
• La classe java.net.Socket permet de programmer l'interface côté client et la communication effective par flot d’octets
• Mode non connecté (UDP)
• Les classes java.net.DatagramSocket et java.net.DatagramPacket permettent de programmer la communication en mode
datagramme
veur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.InetAddress
• Conversion de nom vers adresse IP
• méthodes permettant de créer des objets adresses IP
• InetAddress InetAddress.getLocalHost() pour obte nir une InetAddress de l’hôte
• InetAddress InetAddress.getByName(String id) pour obte nir une InetAddress d’une ma chine donné e
• InetAddress[ ] InetAddress.getAllByName(String id) pour obte nir toute s le s InetAddress d’un s ite
• Le pa ra mè tre id pe ut ê tre un nom de ma chine (" prevert.upmf- grenoble.fr" ) ou un numé ro IP ("195.221.42.159")
• Ce s 3 fonctions pe uve nt le ve r une e xce ption
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.InetAddress
• Conversions inverses
• Des méthodes applicables à un objet de la classe
InetAddress permettent d'obtenir dans divers formats des adresses IP ou des noms de site
• String getHostName() obtie nt le nom comple t corre s ponda nt à l'a dre s s e IP
• String getHostAddress() obtie nt l'a dre s s e IP s ous forme “%d.%d.%d.%d”
• byte[] getAddress() obtie nt l'a dre s s e IP s ous forme
d'un ta ble a u d'octe ts
veur – Master IC2A/DCISS – Christian Bulfone
Exemples
Obtenir le nom et le numéro IP de la machine sur laquelle on travaille :
try{
InetAddress monAdresse = InetAddress.getLocalHost();
System.out.println(monAdresse.getHostName());
System.out.println(monAdresse.getHostAddress());
} catch(UnknownHostException uhe){
System.out.println("Inconnu !");
}
Obtenir le nom et le numéro IP d’une autre machine :
try{
InetAddress uneAdresse = InetAddress.getByName(nom);
System.out.println(uneAdresse.getHostName());
System.out.println(uneAdresse.getHostAddress());
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.ServerSocket
• Cette classe implante un objet ayant un comportement de serveur via une interface par socket
• Constructeurs
• ServerSocket(int port)
• ServerSocket(int port, int backlog)
• ServerSocket(int port, int backlog, InetAddress bindAddr)
• Cré e nt un obje t s e rve ur à l'é coute du port s pé cifié
• La ta ille de la file d'a tte nte de s de ma nde s de conne xion pe ut ê tre e xplicite me nt s pé cifié e via le pa ra mè tre backlog
• S i la ma chine pos s è de plus ie urs a dre s s e s , on pe ut a us s i re s tre indre l'a dre s s e s ur la que lle on a cce pte le s conne xions
• Note : ce la corre s pond à l'utilis a tion de s primitive s s ys tè me s
socket() , bind() e t listen()
veur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.ServerSocket
• Méthodes
• Socket accept() a cce pte une conne xion e ntra nte
• Mé thode bloqua nte , ma is dont l'a tte nte pe ut ê tre limité e da ns le te mps pa r l'a ppe l pré a la ble de la mé thode setSoTimeout
(voir plus loin)
• void close() fe rme la s ocke t
• InetAddress getInetAddress() re tourne l’a dre s s e du s e rve ur
• int getLocalPort() re tourne le port s ur le que l le
s e rve ur é coute
e client-serveur – Master IC2A/DCISS – Christian Bulfone
// création d’un socket serveur sur le port port
ServerSocket serveurSocket = new ServerSocket(port);
try{
while(true){
// Attente de la connexion d’un client
Socket clientServiceSocket = serveurSocket.accept();
// et création du socket clientServiceSocket si // acceptation de la connexion
… }
catch(IOException ioe) { . . . }
Classe java.net.ServerSocket
• Une ServerSocket serveur permet à des clients de
se connecter, la connexion étant ensuite gérée par une
Socket
veur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.Socket
• Cette classe est utilisée pour la programmation des sockets connectées, côté client et côté serveur
• Constructeurs
• Socket(String host, int port)
• Cons truit une nouve lle s ocke t e n te nta nt une
conne xion à la ma chine hôte host s ur le port port
• Le vé e d’e xce ption :
• UnknownHostException s i la ma chine hôte n’e xis te pa s
• IOException s ’il n’y a pa s d’a pplica tion s e rve ur
dé ma rré e s ur le port port
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.Socket
• Socket(InetAddress address, int p)
• Cons truit une nouve lle s ocke t e n te nta nt une conne xion à la ma chine hôte d’a dre s s e address s ur le port p
• Le vé e d’e xce ption :
• IOException s ’il n’y a pa s d’a pplica tion s e rve ur dé ma rré e s ur le port p
• De ux a utre s cons tructe urs pe rme tte nt e n outre de fixe r l'a dre s s e IP e t le numé ro de port utilis é s côté clie nt (plutôt que d'utilis e r un port dis ponible que lconque )
• Socket(String host, int port, InetAddress localAddr, int localPort)
• Socket(InetAddress addr, int port, InetAddress localAddr, int localPort)
• Note : tous ce s cons tructe urs corre s ponde nt à l'utilis a tion de s primitive s s ys tè me s socket() , bind() (é ve ntue lle me nt) e t connect()
bind() dé finit le port loca l
veur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.Socket
• Méthodes
• void close() fe rme ture de la socket (pe ut le ve r une e xce ption IOException )
• void shutDownInput() fe rme ture de la socket pour la le cture (pe ut le ve r une e xce ption IOException )
• void shudownOutput() fe rme ture de la socket pour l’é criture (pe ut le ve r une e xce ption IOException )
• InetAddress getLocalAddress() : a dre s s e de la ma chine hôte
• InetAddress geInetAddress() : a dre s s e de la ma chine à la que lle on e s t conne cté
• int getLocalPort() : le port loca l
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.Socket
• La communication effective sur une connexion par socket utilise la notion de flots de données (java.io.OutputStream e t
java.io.InputStream)
• Mé thode utilis é e pour obte nir le s flots e n e ntré e (le cture )
• InputStream getInputStream()
• InputStream doit ê tre « ha billé » pa r :
• DataInputStream
• InputStreamReader
• Exe mple s
Socket socket …
DataInputStream entree = new DataInputStream(socket.getInputStream());
String chaine = entree.readUTF();
ou
BufferedReader entree =
new BufferedReader(new InputStreamReader(socket.getInputStream()) );
String chaine = entree.readLine();
veur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.Socket
• Méthode utilisée pour obtenir les flots en sortie (écriture)
• OutputStream getOutputStream()
• OutputStream doit ê tre « ha billé » pa r :
• DataOutputStream
• PrinterWriter
• Exe mple s
Socket socket …
DataOutputStream sortie =
new DataOutputStream(socket.getOutputStream());
sortie.writeUTF(chaine);
ou
PrinterWriter sortie = new PrinterWriter (socket.getOutputStream());
sortie.println(chaine);
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Socket Options
• TCP_NODELAY :
• void setTcpNoDelay(boolean b) e t boolean getTcpNoDelay()
• vra i : implique que le s pa que ts s ont e nvoyé s s a ns dé la i
• fa ux :
• le s pe tits pa que ts s ont re groupé s a va nt d’ê tre e nvoyé s
• le s ys tè me a tte nd de re ce voir le me s s a ge d’a cquitte me nt du pa que t pré cé de nt, a va nt d’e nvoye r le pa que t s uiva nt (a lgorithme de Na gle )
• SO_LINGER :
• void setSoLinger(boolean b, int s) e t int getSoLinger ()
• ce pa ra mè tre indique ce qu’il fa ut fa ire de s pa que ts non e ncore e nvoyé s lors que la s ocke t e s t fe rmé e
• fa ux : la s ocke t e s t fe rmé e immé dia te me nt, e t le s pa que ts non e nvoyé s pe rdus
• vra i : la fe rme ture de la s ocke t bloque pe nda nt s s e conde s , pe nda nt
le s que lle s le s donné e s pe uve nt ê tre e nvoyé e s , e t le s a cquitte me nts
re çus
veur – Master IC2A/DCISS – Christian Bulfone
Socket Options
• SO_TIMEOUT :
• void setSoTimeout(int timeout) e t int getSoTimeout()
• P re nd e n pa ra mè tre le dé la i de ga rde e xprimé e n millis e conde s
• La va le ur pa r dé fa ut 0 é quiva ut à l'infini
• À l'e xpira tion du dé la i de ga rde , l'e xce ption InterruptedIOException e s t le vé e
• SO_SNDBUF :
• void setSendBufferSize(int s) e t int getSendBufferSize()
• SO_RCVBUF :
• void setReceiveBufferSize(int s) e t int getreceiveBufferSize()
• pe rme tte nt d’a jus te r la ta ille de s ta mpons pour a ugme nte r le s
pe rforma nce s ; on utilis e ra de s ta mpons plus gra nds s i :
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Socket Options
• SO_KEEPALIVE :
• void setKeepAlive(boolean b) e t boolean getKeepAlive()
• qua nd l’option e s t mis e à vra i : s ’il n’y a pa s e u de tra ns fe rt de donné e s s ur la s ocke t de puis 2 he ure s (e n gé né ra l), TCP e nvoie un pa que t a u pa rte na ire . 3 pos s ibilité s :
• Le pa rte na ire ré pond pa r un me s s a ge d’a cquitte me nt (ACK), tout e s t OK
• Le pa rte na ire ré pond a ve c un RS T ; le pa rte na ire a e u une inte rruption, s uivi d’un re dé ma rra ge : la s ocke t e s t fe rmé e
• P a s de ré pons e du pa rte na ire : la s ocke t e s t fe rmé e
veur – Master IC2A/DCISS – Christian Bulfone
Client en mode connecté
BufferedReader entree;
try{
clientSocket = new Socket(hote, port);
entree = new BufferedReader(new InputStreamReader ( clientSocket.getInputStream () ));
while (true){
String message = entree.readLine();
System.out.println(message);
}
}catch(UnknownHostException uhe){
System.out.println("UnknownHostException");
}catch(IOException ioe){
System.out.println("IOException");
PrintWriter sortie = new printWriter (
clientSocket.getOutputStream(), true);
BufferedReader entree = new BufferedReader ( new InputStreamReader(
clientSocket.getInputStream()));
clientSocket = new Socket("prevert.upmf-grenoble.fr", 8254);
BufferedReader clavier = new BufferedReader(
new InputStreamReader(System.in));
String requete, reponse;
while (true) {
requete = clavier.readLine(); // utilisateur entre la requête sortie.println(requete); // envoyer la requête au serveur
Sur un client
Le client et le serveur peuvent maintenant communiquer Le client et le serveur sont à présent connectés
serveurSocket = new ServerSocket(8254);
clientServiceSocket = serveurSocket.accept();
PrintWriter sortie = new printWriter (
clientServiceSocket.getOutputStream(), true);
BufferedReader entree = new BufferedReader ( new InputStreamReader(
clientServiceSocket.getInputStream()));
String requete;
String reponse;
while (true) {
requete = entree.readLine();
// exécuter le service
// envoyer la réponse au client
Sur le serveur (prevert.upmf-grenoble.fr)
doit être connu
du client
Client / serveur en mode connecté (très simplifié)
serveurSocket = new ServerSocket(8254);
while (true) {
Socket clientServiceSocket = serveurSocket.accept();
Service monService = new Service(clientServiceSocket);
// crée un nouveau thread pour le nouveau client monService.start();
// lance l’exécution du thread }
public class Service extends Thread { Socket clientServiceSocket;
String requete, reponse;
public Service(Socket socket) { clientServiceSocket = socket;
}
public void run() {
PrintWriter sortie = new printWriter (
clientServiceSocket.getOutputStream(), true);
BufferedReader entree = new BufferedReader ( new InputStreamReader(
clientServiceSocket.getInputStream()));
try {
requete = entree.readLine();
// exécuter le service
// envoyer la réponse au client Programme du veilleur
Programme des exécutants
Un serveur concurrent en mode connecté
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Sockets en mode non connecté
• Deux classes
• DatagramSocket : un s e ul type de s ocke t
• DatagramPacket : forma t de me s s a ge pour UDP
• Conve rs ion e ntre donné e s e t pa que ts (da ns le s 2 s e ns )
• Le s Da ta gra mP a cke t s ont cons truits diffé re mme nt pour l’e nvoi e t la ré ce ption
Données à envoyer (byte [])
Données à recevoir (byte [])
DatagramPacket
data packet data
packet = new DatagramPacket(data, data.length)
packet = new DatagramPacket(data, data.length, adresseIP, port)
veur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.DatagramSocket
• Cette classe permet d'envoyer et de recevoir des paquets (UDP)
• Constructeurs
• DatagramSocket()
• DatagramSocket(int port)
• Cons truit une s ocke t da ta gra mme e n s pé cifia nt
é ve ntue lle me nt un port s ur la ma chine loca le (pa r dé fa ut, un port dis ponible que lconque e s t chois i)
• Le vé e é ve ntue lle de SocketException
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.DatagramSocket
• Emission
• void send(DatagramPacket p)
• Le vé e é ve ntue lle de IOException
• Ré ce ption
• void receive(DatagramPacket p)
• Ce s opé ra tions pe rme tte nt d'e nvoye r e t de re ce voir un pa que t
• Un pa que t e s t un obje t de la cla s s e
java.net.DatagramPacket qui pos s è de une zone de
donné e s e t (é ve ntue lle me nt) une a dre s s e IP e t un numé ro de port (de s tina ta ire da ns le ca s send , é me tte ur da ns le ca s
receive )
veur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.DatagramSocket
• void close() : fe rme ture de la s ocke t ; pe ns e r à toujours fe rme r le s s ocke ts qui ne s ont plus utilis é e s
• int getLocalPort() : re tourne le port s ur le que l on é coute , ou le port a nonyme s ur le que l on a e nvoyé le pa que t
• Il e s t pos s ible de « conne cte r » une s ocke t da ta gra mme à un de s tina ta ire
• void connect(InetAddress ia, int p)
• Da ns ce ca s , le s pa que ts é mis s ur la s ocke t s e ront toujours pour l'a dre s s e s pé cifié e
• La conne xion s implifie l'e nvoi d'une s é rie de pa que ts (il n'e s t plus
né ce s s a ire de s pé cifie r l'a dre s s e de de s tina tion pour cha cun d'e ntre e ux) e t a ccé lè re le s contrôle s de s é curité (ils ont lie u une fois pour toute à la conne xion)
• La « dé conne xion » a ve c void disConnect() dé fa it l'a s s ocia tion (la
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.DatagramPacket
• Emission
• DatagramPacket (byte[] buf, int length, InetAddress ia, int port)
• cons truit un da ta gra mme de s tiné à ê tre e nvoyé à l’a dre s s e ia, s ur le port port
• le ta mpon buf de longue ur length contie nt le s octe ts à e nvoye r
• Ré ce ption
• DatagramPacket (byte[] buf, int length)
• cons truit un da ta gra mme de s tiné à re ce voir de s donné e s
• le ta mpon buf de longue ur length contie nt le s octe ts à
re ce voir
veur – Master IC2A/DCISS – Christian Bulfone
Classe java.net.DatagramPacket
• InetAddress getAddress() : re tourne l’a dre s s e de l’hôte d’où vie nt ou où va le pa que t
• void setAddress(InetAddress ia) : cha nge l’a dre s s e où e nvoye r le pa que t
• int getPort() : le port de l’hôte qui a e nvoyé , ou ve rs le que l on e nvoie
• void setPort(int port) : cha nge le port ve rs le que l on e nvoie le pa que t
• byte[] getData() : re tourne le ta ble a u conte na nt le s donné e s à e nvoye r ou re çue s
• void setData(byte[] d) : cha nge le ta ble a u de s donné e s à e nvoye r
• int getLength() : re tourne la ta ille du ta ble a u de s donné e s re çue s
e client-serveur – Master IC2A/DCISS – Christian Bulfone
Exemple
try{
byte [] tampon;
tampon = . . . ;
InetAddress ia = . . .;
int port = . . .;
DatagramPacket envoiPaquet = new DatagramPacket ( tampon, tampon.length, ia, port);
DatagramSocket socket = new DatagramSocket();
socket.send(envoiPaquet);
}catch(SocketException se){
}catch(IOException ioe){
}
Pour l’envoi de datagramme
try{
byte [] tampon = new byte[];
int port = . . .;
DatagramPacket receptionPaquet = new DatagramPacket (
tampon, tampon.length);
DatagramSocket socket = new DatagramSocket(port);
socket.receive(receptionPaquet);
String s = new String (receptionPaquet.getData());
}catch(SocketException se){
}catch(IOException ioe){
Pour la réception de datagramme
DatagramSocket socket = new DatagramSocket();
byte [] envoiTampon = new byte[1024];
byte [] receptionTampon = new byte[1024];
String requete, reponse;
requete = … // dépend de l’application envoiTampon = requete.getBytes();
DatagramPacket envoiPaquet = new DatagramPacket(
envoiTampon, envoiTampon.length,
InetAddress.getbyname("prevert.upmf-grenoble.fr"), 8254);
socket.send(envoiPaquet);
DatagramPacket receptionPaquet = new DatagramPacket(
receptionTampon, receptionTampon.length);
socket.receive(receptionPaquet);
Sur un client Sur le serveur (prevert.upmf-grenoble.fr)
doit être connu du client
DatagramSocket socket = new DatagramSocket(8254);
byte [] receptionTampon = new byte[1024];
byte [] envoiTampon = new byte[1024];
String requete, reponse;
while (true) {
DatagramPacket receptionPaquet = new DatagramPacket(
receptionTampon, receptionTampon.length);
socket.receive(receptionPaquet);
requete = new String(receptionPaquet.getData());
// déterminer adresse et port du client
InetAddress clientAdresse = receptionPaquet.getAddress();
int clientPort = receptionPaquet.getPort();
// exécuter le service …
// envoyer la réponse au client
réception
requête envoi requête
Client / serveur en mode non connecté
e client-serveur – Master IC2A/DCISS – Christian Bulfone