• Aucun résultat trouvé

Le modèle client-serveur

N/A
N/A
Protected

Academic year: 2022

Partager "Le modèle client-serveur"

Copied!
60
0
0

Texte intégral

(1)

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 /

(2)

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 TCP

Internet

Datagramme IP

Accès réseau

Trame (Ethernet)

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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)

(8)

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

(9)

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

(10)

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

(11)

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 )

(12)

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

(13)

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

p

Processus veilleur Création dynamique des

exécutants

(14)

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

(15)

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 ?

(16)

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

(17)

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 )

(18)

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

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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

(24)

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

(25)

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

(26)

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)

(27)

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é

(28)

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

(29)

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

(30)

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

(31)

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)

(32)

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

(33)

L’API Socket en Java

(34)

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

(35)

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

(36)

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

(37)

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());

(38)

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()

(39)

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

(40)

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

(41)

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

(42)

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

(43)

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

(44)

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();

(45)

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);

(46)

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

(47)

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 :

(48)

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

(49)

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");

(50)

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é)

(51)

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é

(52)

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)

(53)

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

(54)

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 )

(55)

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

(56)

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

(57)

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

(58)

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

(59)

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é

(60)

e client-serveur – Master IC2A/DCISS – Christian Bulfone

et voilà !

Références

Documents relatifs

– Comment casser la relation forte entre client et serveur, comment rendre le client indépendant du serveur pour l'appel.

PHP langage spécialisé pour les applications web (utilisé en conjonction avec Apache) ; MySQL comme serveur de base de données. 5 Projet : réalisation

Le module de gestion des données peut être hébergé par un serveur distant (SGBD, serveur web). Le module de gestion de

• avec connexion / sans connexion (ou avec session): nécessité (/ou non) d'établir une connexion entre le client et le serveur. 11 2ème année BTS DSI Prof:EL

 Caractériser cette socket en terme de communication : -au moins un numéro de port (associé au service) -éventuellement une adresse IP (interface cible).  Lui permettre de

//On associe un paquet à un buffer vide pour la réception DatagramPacket paquet =new DatagramPacket(buffer,buffer.length());. //On crée un socket pour écouter sur le

Serveur en gestion multi--clients clients en en mode connecté. mode

◮ Réponse : message transmis par un serveur à un client suite à l’exécution d’une opération, contenant le résultat