Chapitre I Presentation Client Server PDF
Chapitre I Presentation Client Server PDF
Chapitre I Presentation Client Server PDF
I. Introduction
L'architecture logicielle est le processus de conception de l'organisation globale d'un logiciel, y
compris la division du logiciel en sous-systèmes, en décidant comment ceux-ci interagiront et en
déterminant les interfaces.
L’architecture client/serveur signifie que des machines clientes (des machines faisant partie du
réseau) contactent un serveur, une machine généralement très puissante en termes de capacités
d'entrée-sortie, qui leur fournit des services. Ces services sont des programmes fournissant des
données telles que l'heure, des fichiers, une connexion, etc. Les services internet sont conçus selon
cette architecture. Ainsi, chaque application est composée de logiciel serveur et logiciel client. A
un logiciel serveur, peut correspondre plusieurs logiciels clients développés dans différents
environnements: Unix, Mac, PC...; la seule obligation est le respect du protocole entre les deux
processus communicants.
Le principe clé est que la tâche est divisée ou distribuée entre deux composants logiciels qui
s'exécutent indépendamment sur deux ordinateurs physiquement séparés.
Le modèle n'exige même pas que les composants fonctionnent sur des systèmes d'exploitation ou
de fichiers compatibles. Les programmes client et serveur sont capable de coopérer avec succès
car ils ont été conçus pour être interopérables.
Nous allons dans ce cours faire une présentation générale de l’architecture client-serveur.
1
Programmation client-serveur Java
La figure suivante illustre un programme serveur communiquant avec deux programmes clients.
Les lignes verticales représentent les trois programmes impliqués. Après la connexion, Client 1
envoie un message, reçoit une réponse et se déconnecte. Le client 2 se connecte alors que le client
1 est toujours connecté; il envoie simplement un message puis se déconnecte. Ce diagramme est
un exemple de diagramme de séquence UML. En général, les composants d'un système client-
serveur interagissent comme suit:
2
Programmation client-serveur Java
Normalement, l'action prise par le serveur inclut l'envoi d'un message au client. La plupart des
serveurs doivent pouvoir gérer les connexions de nombreux clients et répondre aux messages de
tous les clients connectés. La façon dont cela est accompli sera décrite ci-dessous. Il est possible
que le même programme soit à la fois un client et un serveur en même temps. Par exemple, un
serveur de base de données peut se connecter à un autre serveur afin d'obtenir des données
supplémentaires. Il est également possible que le client et le serveur soient situés sur le même
ordinateur et qu'ils fonctionnent comme des processus distincts. Cependant, il est assez typique
pour qu'ils soient situés sur des ordinateurs distincts, peut-être dans des endroits géographiques
différents.
3
Programmation client-serveur Java
Le tableau 3.1 répertorie certains types importants de systèmes qui utilisent l’architecture client-
serveur.
4
Programmation client-serveur Java
5
Programmation client-serveur Java
2. L’architecture 3-teir
Une variante importante de l'architecture client-serveur est le modèle à trois niveaux sous lequel
un serveur communique à la fois avec un client (habituellement via Internet) et un autre serveur
de base de données (habituellement dans un intranet, pour des raisons de sécurité). Le serveur agit
en tant que client lors de l'accès au serveur de base de données.
3. L’architecture N-tier
Dans l'architecture à 3 niveaux, chaque serveur (niveaux 2 et 3) effectue une tâche (un service)
spécialisée. Un serveur peut donc utiliser les services d'un ou plusieurs autres serveurs afin de
fournir son propre service. Par conséquent, l'architecture à trois niveaux est potentiellement une
architecture à N-tier.
4. L’architecture Peer-to-Peer
Une autre extension du modèle d'architecture client-serveur est le modèle d'architecture Peer-to-
Peer. Un système peer-to-peer est composé de différents composants logiciels qui sont répartis sur
plusieurs hôtes. Chacun de ces composants peut être à la fois un serveur et un client. Tous les deux
composants peuvent configurer un canal de communication pour échanger des informations au
besoin. Figure 9.9 montre une architecture peer-to-peer pour la messagerie instantanée. Les
messages ne doivent plus être envoyés via un serveur central. Toutefois, avant que deux pairs ne
puissent communiquer, ils doivent se découvrir mutuellement. Un serveur central peut encore être
utilisé pour cela.
6
Programmation client-serveur Java
Un seul programme qui fait tout peut également être une alternative à un client-serveur système.
Cependant, l'architecture client-serveur peut avoir les avantages suivants:
7
Programmation client-serveur Java
Toutes les données peuvent être conservées centralement sur le serveur, ce qui rend plus
facile d'assurer sa fiabilité. Par exemple, il est plus facile de s'assurer que des sauvegardes
régulières sont effectuées des données d'un serveur unique, plutôt que d'essayer de
sauvegarder séparément les données sauvegardées par plusieurs programmes distincts.
À l'inverse, la distribution de données entre plusieurs distributions géographiquement
différentes les clients ou les serveurs peuvent signifier que si une catastrophe survient en
un seul endroit, la perte de données est minimisée.
Les utilisateurs peuvent accéder à l'information simultanément. Il est possible de
accomplissez ceci en utilisant un seul grand programme, mais cette approche tend à être
plus complexe.
Les clients concurrents peuvent être écrits pour communiquer avec le même serveur, et
vice versa; par exemple, différents navigateurs Web peuvent communiquer avec le même
serveur Web. Cela peut encourager l'innovation.
8
Programmation client-serveur Java
Le client émet une requête vers le serveur grâce à son adresse IP et le port, qui désigne un
service particulier du serveur
Le serveur reçoit la demande et répond à l'aide de l'adresse de la machine cliente et son
port
9
Programmation client-serveur Java
2. Il doit commencer à écouter les clients qui tentent de se connecter. Tant qu’il ne commence
pas à écouter, tout client qui essaie de se connecter ne réussira pas.
3. Il doit gérer les types d'événements suivants provenant de clients, qui peuvent se produire
à tout moment:
Il accepte les connexions des clients. Ce processus impliquera normalement une
certaine forme de validation pour s'assurer que le client est autorisé à se connecter.
Lorsqu'un client est connecté, le serveur conserve un enregistrement de la connexion.
Il réagit aux messages des clients connectés. C’est la plus importante chose que le
serveur fait. Dans un serveur de ligne aérienne, un message pourrait être une demande
pour réserver un passager ou une requête pour savoir qui est réservé. En réponse à un
message provenant d'un client, un serveur peut faire plusieurs types de choses, y
compris effectuer des calculs et obtenir des informations. Normalement, le serveur
enverra des informations au client demandeur; il pourrait également envoyer un
message à un autre client ou diffuser des messages à plusieurs clients à la fois.
Il permet de déconnecter les clients. Un client peut demander la déconnexion en
envoyant un message au serveur ou en se déconnectant simplement; il pourrait
"disparaître" s'il tombe en panne ou si sa connexion au réseau tombe; enfin, le serveur
peut forcer un client à se déconnecter si le client ne se «comporter» pas bien.
4. Le serveur peut être obligé de cesser d'écouter. Cela signifie qu'il n'acceptera plus de
nouvelles connexions client, mais il continuera de desservir actuellement les clients
connectés. Cela peut se produire lorsque le nombre de clients connectés devient trop élevé;
Dans une telle situation, le serveur rejette de nouveaux clients afin qu'il ne manque pas de
ressources telles que la mémoire. Quand il dispose de ressources suffisantes encore une
fois, il peut recommencer à écouter. Le serveur peut également choisir d'arrêter d'écouter
avant la fermeture, permettant aux clients connectés de mettre fin à leur travail.
5. Il doit s’Éteindre proprement, c’est-à-dire Arrêter, si nécessaire. Éteindre proprement
signifie faire des choses telles que la notification de chaque client avant de terminer sa
connexion.
Les activités principales ci-dessus d'un serveur sont illustrées à la figure 3.3, qui est un exemple
d'un diagramme d'état UML.
10
Programmation client-serveur Java
11
Programmation client-serveur Java
Les activités principales ci-dessus d'un client sont illustrées à la figure 3.4, qui montre une
éventuelle séquence d'activités. Notez que le travail «régulier» du client peut doit procéder en
même temps que le processus de réponse aux événements provenant du serveur. Ceci est indiqué
dans la figure 3.4 par les barres horizontales qui montre l'exécution se divisant en deux chemins
distincts. Nous allons le prendre en compte concurrence plus en profondeur dans la prochaine sous-
section. La figure 3.4 est un exemple d'un diagramme d'activité UML.
12
Programmation client-serveur Java
Attendre les interactions avec l'utilisateur final et répondre lorsque les interactions se
produire.
Attendre des messages provenant du serveur et en réponse aux messages arrivée.
Ceux-ci doivent généralement être mis en œuvre à l'aide de multiples threads de contrôle qui peut
être exécuté simultanément. Sans ce mécanisme, lorsque le client est en attente d'un type de
contribution, il ne sera pas en mesure de répondre à l'autre type de contribution. Une exception à
cela peut se produire chez les clients qui n'ont pas besoin d'interagir avec l'utilisateur de quelque
manière que ce soit. De même, le serveur devrait normalement avoir des threads simultanés qui
devraient effectuer les opérations suivantes:
13
Programmation client-serveur Java
Pour chaque client connecté, attendre les messages provenant de ce client, et répondre
quand les messages arrivent.
Les serveurs fonctionnent normalement avec au moins deux threads simultanés, et en général n +
2 threads où n est le nombre de clients connectés. Figure 3.5 illustre les différents threads
s'exécutant dans un système client-serveur typique. Dans ce diagramme un seul client (client A)
est affiché communicant avec le serveur; cependant, un thread pour un deuxième client dormant
(client B) est également affiché.
14
Programmation client-serveur Java
Dans un système client léger, le client est aussi petit que possible et la plupart du travail se fait sur
le serveur. Dans l'approche opposée, appelée système de client-lourd, le plus de travail possible
est délégué aux clients. Les deux approches sont illustrées à la figure 3.6.
Un avantage important d'un système client léger est qu'il est facile à télécharger le programme
client sur le réseau et le lancer. En Java, les applets sont généralement des clients légers, car il est
souhaitable qu'ils se téléchargent rapidement. Un avantage des systèmes de client-lourd est que,
puisque plusieurs opérations sont distribuées aux clients, une meilleure utilisation est faite des
ressources informatiques disponibles; le serveur peut par conséquent, soit plus petit ou être conçu
pour gérer plus de clients.
Une des principales considérations dans le choix entre un client léger et un client lourd est avec
quelle intensité le système utilisera le réseau pour communiquer - faire un mauvais choix peut
parfois entraîner un réseau surchargé.
En fonction de la nature du système, l’utilisation, soit d’un client léger ou d’un client lourd peut
prendre le moins de ressources réseau. Dans certains cas, un système client léger peut avoir besoin
de communiquer le moins parce qu'il envoie généralement seulement de simples requêtes
utilisateur au serveur. D'autre part, un client léger pourrait avoir besoin de communiquer avec le
serveur beaucoup plus fréquemment qu'un client lourd et pour téléchargez des résultats
volumineux des opérations du serveur.
15
Programmation client-serveur Java
Le serveur doit être programmé pour comprendre ce langage. De même, un autre langage est
constitué par les types de messages que le serveur est autorisé à envoyer au client. Lorsqu'un client
et un serveur communiquent, ils ont effectivement une conversation utilisant ces deux langages.
Comme pour une conversation humaine, il doit y avoir des règles pour s'assurer, par exemple, que
les parties communicantes prennent un tour pour parler. Les règles décrivent également les
séquences de messages que le client et le serveur doivent échanger, afin de parvenir à un accord
sur quelque chose ou accomplir une autre tâche.
Les deux langages et les règles de la conversation, prises ensemble, s'appellent le protocole. La
conception des protocoles peut être très complexe; dans des systèmes simples, tels que ceux
discutés dans ce cours, le protocole n'est qu'une liste de demandes service et leurs réponses.
16
Programmation client-serveur Java
Dans cette partie nous allons présenter ces deux protocoles et voir comment les protocoles TCP et
UDP sont différents.
6. Le protocole TCP
TCP (Transmission Control Protocol) est un protocole de connexion qui fournit un flux de données
fiable entre deux ordinateurs.
TCP fournit un canal point à point pour les applications nécessitant des communications fiables.
Le protocole de transfert hypertexte (HTTP), le protocole de transfert de fichiers (FTP) et Telnet
sont des exemples d'applications nécessitant un canal de communication fiable. L'ordre dans lequel
17
Programmation client-serveur Java
les données sont envoyées et reçues sur le réseau est essentiel au succès de ces applications.
Lorsque HTTP est utilisé pour lire à partir d'une URL, les données doivent être reçues dans l'ordre
dans lequel elles ont été envoyées. Sinon, vous recevez un fichier HTML erroné, un fichier zip
corrompu ou une autre information non valide.
18
Programmation client-serveur Java
7. Le protocole UDP
UDP (User Datagram Protocol) est un protocole qui envoie des paquets indépendants de données,
appelés datagrammes, d'un ordinateur à l'autre sans garantie quant à l'arrivée. UDP n'est pas basé
sur la connexion comme TCP.
Le protocole UDP prévoit une communication qui n'est pas garantie entre deux applications sur le
réseau. UDP n'est pas basé sur la connexion comme TCP. Plutôt, il envoie des paquets de données
indépendants, appelés datagrammes, d'une application à une autre. L'envoi de datagrammes
ressemble beaucoup à l'envoi d'une lettre par le service postal: l'ordre de livraison n'est pas
important et n'est pas garanti, et chaque message est indépendant de l'autre.
Considérons, par exemple, un serveur d'horloge qui envoie l'heure actuelle à son client lorsque
cela est demandé. Si le client manque un paquet, il n'est pas vraiment logique de le renvoyer car le
temps sera incorrect lorsque le client le recevra sur le deuxième essai. Si le client effectue deux
requêtes et reçoit des paquets du serveur hors service, cela n'a pas d'importance car le client peut
comprendre que les paquets sont en panne et font une autre demande. La fiabilité de TCP n'est pas
nécessaire dans ce cas car elle entraîne une dégradation des performances et peut entraver l'utilité
du service.
Un autre exemple d'un service qui n'a pas besoin de garantir un canal fiable est la commande ping.
Le but de la commande ping est de tester la communication entre deux programmes sur le réseau.
En fait, ping doit connaître les paquets abandonnés ou hors-commande pour déterminer la bonne
ou la mauvaise connexion. Un canal fiable invaliderait complètement ce service.
Le protocole UDP prévoit une communication qui n'est pas garantie entre deux applications sur le
réseau. UDP n'est pas basé sur la connexion comme TCP. Plutôt, il envoie des paquets
indépendants de données d'une application à une autre. L'envoi de datagrammes ressemble
beaucoup à l'envoi d'une lettre par le biais du service de messagerie: l'ordre de livraison n'est pas
important et n'est pas garanti, et chaque message est indépendant de tout autre.
Remarque:
19
Programmation client-serveur Java
De nombreux parefeux (firewall) et routeurs ont été configurés pour ne pas permettre les paquets
UDP. Si vous rencontrez des difficultés pour vous connecter à un service en dehors de votre pare-
feu ou si des clients ont du mal à vous connecter à votre service, demandez à votre administrateur
système si UDP est autorisé.
20
Programmation client-serveur Java
Les données transmises sur Internet s'accompagnent d'une information qui identifie l'ordinateur et
le port pour lequel elle est destinée. L'ordinateur est identifié par son adresse IP 32 bits, que l'IP
utilise pour fournir des données au bon ordinateur sur le réseau. Les ports sont identifiés par un
numéro de 16 bits, que TCP et UDP utilisent pour fournir les données à la bonne application.
Dans une communication basée sur la connexion telle que TCP, une application serveur lie un
socket à un numéro de port spécifique. Cela a pour effet d'enregistrer le serveur avec le système
pour recevoir toutes les données destinées à ce port. Un client peut alors se retrouver avec le
serveur sur le port du serveur, comme illustré ici:
Les protocoles TCP et UDP utilisent des ports pour mapper les données entrantes vers un processus
particulier exécuté sur un ordinateur.
Dans la communication basée sur des datagrammes tels qu’UDP, le paquet de datagramme
contient le numéro de port de sa destination et UDP achemine le paquet vers l'application
appropriée, comme illustré sur cette figure:
21
Programmation client-serveur Java
Les numéros de port vont de 0 à 65 535 car les ports sont représentés par des nombres de 16 bits.
Les numéros de port allant de 0 à 1023 sont restreints; ils sont réservés pour être utilisés par des
services bien connus tels que HTTP et FTP et d'autres services système. Ces ports s'appellent des
ports connus. Vos applications ne devraient pas essayer de se lier à elles.
22