[go: up one dir, main page]

0% ont trouvé ce document utile (0 vote)
230 vues6 pages

TP Python : Modèle Client-Serveur

Transféré par

sanougilchrist18
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
230 vues6 pages

TP Python : Modèle Client-Serveur

Transféré par

sanougilchrist18
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 6

Chapitre 8 NSI

TP n ° 1 – Modèle client-serveur en Python


EVALUATION : NOM : ………………..

Compétences Capacités N I C E Prénom : ………………..

Rechercher de
l’information

Analyser et modéliser
un problème en termes
de flux et de
traitement
d’informations

Dans ce TP, nous allons apprendre à faire communiquer deux applications grâce aux sockets, des objets qui
permettent de connecter un client à un serveur et de transmettre des données de l’un à l’autre.

I. Rappel sur le protocole TCP :


TCP (Transmission Control Protocol), est un protocole orienté connexion. Les applications sont
connectées pour communiquer et TCP permet de s'assurer qu'une information envoyée au travers du réseau
bien été réceptionnée par l'autre application. Si la connexion est rompue pour une raison quelconque, les
applications doivent rétablir la connexion pour communiquer de nouveau.
Il existe d’autres protocoles de transport, comme par exemple UDP, qui ne se soucie pas du tout si les
informations sont arrivées à bon port. Cela peut paraître surprenant, mais dans certains cas, une petite perte
d’information peut ne pas avoir de conséquences notables.

II. Client et serveur:


Nous nous plaçons dans le modèle client-serveur ; on trouve en général un serveur et plusieurs clients. Le
serveur, c’est une machine qui va traiter les requêtes du client.
Dans les exemples que nous allons voir nous allons créer deux applications : l’application serveur et
l’application client. Le serveur écoute en attendant des connexions et les clients se connectent au serveur.

1) Les différentes étapes :


Nos applications vont fonctionner selon un schéma assez similaire. Voici dans l’ordre les étapes du client et
du serveur. Les étapes sont très simplifiées, la plupart des serveurs peuvent communiquer avec plusieurs
clients mais nous ne verrons pas cela tout de suite.

Le serveur :
1. Attends une connexion de la part du client
2. Accepte la connexion qu’on le client se connecte
3. Échange des informations avec le client
4. Ferme la connexion

Le client :
1. Se connecter au serveur
2. Échange des informations avec le serveur
3. Ferme la connexion
1
2) Etablir la connexion :
Pour que le client se connecter au serveur, il nous faut 2 informations :
 Le nom d’hôte (hostname en anglais) qui identifie une machine sur internet ou sur un réseau local.
Les noms d’hôte permettent de représenter des adresse IP de façon plus claire (on a un nom comme
google.fr, plus facile à retenir que l’adresse IP correspondante 142.250.179.99.
 Un numéro de port qui est souvent propre au type d’information que l’on va échanger. Si on
demande une connexion web, le navigateur va en général interroger le port 80 en HTTP ou le port
443 en connexion sécurisée HTTPS. Le numéro de port est compris entre 0 et 65535. Il y en a donc
un certain nombre et les numéros entre 0 et 1023 sont réservés par le système. Il est fortement
déconseillé de les utiliser.

Pour résumer, quand votre navigateur tente d’accéder au site du lycée, il établit une connexion avec le
serveur dont le nom d’hôte est lycee-louis-armand-eaubonne.fr sur le port 80. Dans ce chapitre nous allons
plus volontiers utiliser des noms d’hôtes qu’avec des adresse IP.

III. Les sockets :


Comme nous allons le voir, les sockets sont des objets qui permettent d’ouvrir une connexion avec une
machine locale ou distante et d’échanger avec elle. Ces objets sont définies dans le module socket et nous
allons maintenant voir comment il fonctionne.

Exercice 1 :
1) Lancez Spyder.
2) Dans un programme nommé serveur.py, importez le module socket.

IV. Création du serveur :


Il faut faire appel au constructeur socket. Dans le cas d'une connexion TCP, il prend les deux paramètres
suivants, dans l'ordre :
 socket.AF_INET : la famille d'adresses, ici ce sont des adresses Internet ;
 socket.SOCK_STREAM : le type du socket, SOCK_STREAM pour le protocole TCP.

1) Connecter le socket :
Pour une connexion serveur, qui va attendre des connexions de clients, on utilise la méthode bind. Elle
prend un paramètre : le tuple (nom_hote, port). Mais pour que le serveur écoute sur un port, il faut le
configurer en conséquence en ne renseignant pas le nom de l'hôte sera vide mais en précisant un numéro de
port 1024 et 65535.

2) Faire écouter le socket :


Le socket est prêt à écouter sur le port 12800 mais il n'écoute pas encore. On va avant tout lui préciser le
nombre maximum de connexions qu'il peut recevoir sur ce port sans les accepter. On utilise pour cela la
méthode listen.
On lui passe généralement 5 en paramètre. Cela ne veut pas dire que le serveur ne pourra dialoguer qu'avec 5
clients maximum. Cela veut dire que si 5 clients se connectent et que le serveur n'accepte aucune de ces
connexions, aucun autre client ne pourra se connecter. Mais généralement, très peu de temps après que le
client ait demandé la connexion, le serveur l'accepte. Vous pouvez donc avoir bien plus de clients connectés.

2
3) Accepter une connexion venant du client :
Dernière étape, accepter une connexion. Aucune connexion ne s'est encore présentée mais la méthode
accept qui va être utilisée va bloquer le programme tant qu'aucun client ne s'est connecté. La méthode
accept renvoie deux informations :
 Le socket connecté qui vient de se créer, celui qui va nous permettre de dialoguer avec notre client
tout juste connecté ;
 Un tuple représentant l'adresse IP et le port de connexion du client.
Le port de connexion du client n'est pas le même que celui du serveur, car le client, en ouvrant une
connexion, passe par un port client qui va être choisi par le système parmi les ports disponibles. Il y a donc
deux ports mis en œuvre dans une connexion TCP.

Cette méthode bloque le programme. Elle attend qu'un client se connecte.

Exercice 2 :
1) Compléter votre programme serveur.py avec les instructions précédentes.
2) Exécuter votre programme, et laissez le programme en exécution.

V. Création du client :
Créez votre socket de la même façon :

1) Connecter le client :
Pour se connecter à un serveur, on utilise la méthode connect qui prend en paramètre un tuple contenant le
nom d'hôte (actuellement localhost) et le numéro du port identifiant le serveur (actuellement 12800 )
auquel on veut se connecter.

Exercice 3 :
1) Ouvrir une nouvelle fenêtre d’édition dans Spyder, et écrire dans un programme nommé client.py
les instructions précédentes.
2) Ouvrir une deuxième console dans Spyder pour exécuter le programme client.py.
Maintenant votre serveur et votre client sont connectés ! Si vous retournez dans la console Python abritant le
serveur, vous pouvez constater que la méthode accept ne bloque plus, puisqu'elle vient d'accepter la
connexion demandée par le client. Vous pouvez donc de nouveau saisir du code côté serveur :

La première information, c'est l'adresse IP du client. Ici, elle vaut 127.0.0.1 c'est-à-dire l'IP de l'ordinateur
local. Le second est le port de sortie du client (cette information peut être différente pour vous).

VI. Faire communiquer les sockets :


Pour faire communiquer les sockets, on utilise les méthodes send pour envoyer et recv pour recevoir. Les
informations que vous transmettrez doivent être des chaînes de bytes et non pas de type str !
Côté serveur :

La méthode send vous renvoie le nombre de caractères envoyés c'est à dire ici 32.

3
Côté client :
Maintenant, côté client, on va réceptionner le message que l'on vient d'envoyer. La méthode recv prend en
paramètre le nombre de caractères à lire. Généralement, on lui passe la valeur 1024. Si le message est plus
grand que 1024 caractères, on récupérera le reste après.

Vous pouvez de cette manière faire communiquer des applications entre elles, applications pouvant être
situées sur des ordinateurs différents.
Le client peut également envoyer des informations au serveur et le serveur peut les réceptionner, tout cela
grâce à ces méthodes send et recv.

VII. Fermer la connexion :


Pour fermer la connexion, il faut appeler la méthode close de notre socket.
Côté serveur :

Côté client :

VIII. Premiers programmes :


1) Premier programme serveur :
Voici un premier programme serveur qui n'accepte qu'un seul client et qui fonctionne jusqu'à recevoir du
client le message fin.
Enregistrez ce programme dans votre fichier serveur.py (vous commenterez la partie précédente) puis
exécutez-le.
À chaque message reçu, le serveur envoie en retour le message 'OK'.

2) Premier programme client :


Le programme client va tenter de se connecter sur le port 12800 de la machine locale. Il demande à
l'utilisateur de saisir quelque chose au clavier et envoie ce quelque chose au serveur, puis attend sa réponse.
Enregistrez ce programme dans le fichier client.py puis lancez-le.

4
La méthode encode de str prend en paramètre un nom d'encodage et transforme une chaîne str en chaîne
bytes. Cela est nécessaire car la méthode send n'accepte que le type de données bytes. Cela se fait en
fonction d'un encodage précis (par défaut, Utf-8).
La méthode decode, à l'inverse, est une méthode de bytes. Elle aussi peut prendre en paramètre un
encodage et elle renvoie une chaîne str décodée grâce à l'encodage (par défaut Utf-8).
Sous Windows utilisez de préférence l'encodage Latin-1.

IX. Deuxièmes programmes :


Ce qui sera amélioré :
 Accepter plusieurs clients ;
 Pouvoir envoyer ou recevoir plusieurs messages sans attendre un accusé de réception ;
 Gérer les erreurs.

1) Le module select :
Le module select permet d'interroger plusieurs clients dans l'attente d'un message à réceptionner, sans
paralyser le programme. select va écouter sur une liste de clients et retourner au bout d'un temps précisé.
Ce que renvoie select, c'est la liste des clients qui ont un message à réceptionner. Il suffit de parcourir ces
clients, de lire les messages en attente (grâce à recv).
Utilisation de la fonction select du module select :
La fonction select prend trois ou quatre arguments et en renvoie trois.
 rlist : la liste des sockets en attente d'être lus ;
 wlist : la liste des sockets en attente d'être écrits ;
 xlist : la liste des sockets en attente d'une erreur ;
 timeout : le délai pendant lequel la fonction attend avant de retourner. Si vous précisez en timeout
0, la fonction retourne immédiatement. Si ce paramètre n'est pas précisé, la fonction retourne dès
qu'un des sockets change d'état (est prêt à être lu s'il est dans rlist par exemple) mais pas avant.

Pour ce programme vous allez utiliser rlist et timeout.


Il s'agit de mettre des sockets dans une liste et que select les surveille, en retournant dès qu'un socket est
prêt à être lu. Comme cela votre programme ne bloque pas et il peut recevoir des messages de plusieurs
clients dans un ordre complètement inconnu.
Si vous ne le précisez pas le timeout, select bloque jusqu'au moment où l'un des sockets que vous
écoutez est prêt à être lu. Si vous précisez un timeout de 0, select retournera tout de suite. Sinon, select
retournera au bout du temps que vous indiquez en secondes, ou plus tôt si un socket est prêt à être lu.
Si vous précisez un timeout de 1, la fonction va bloquer pendant une seconde maximum. Mais si un des
sockets en écoute est prêt à être lu dans l'intervalle (c'est-à-dire si un des clients envoie un message au
serveur), la fonction retourne prématurément. select renvoie trois listes (rlist, wlist et xlist), sauf
qu'il ne s'agit pas des listes fournies en entrée mais uniquement des sockets à lire dans le cas de rlist.

5
Exemple :

Cette instruction va écouter les sockets contenus dans la liste clients_connectes. Elle retournera au plus
tard dans 50 millisecondes. Mais elle retournera plus tôt si un client envoie un message. La liste des clients
ayant envoyé un message se retrouve dans la variable rlist. On la parcourt ensuite et on peut appeler recv
sur chacun des sockets.

2) Modification du programme du serveur (le client ne change pas) :


Vous allez créer un serveur pouvant accepter plusieurs clients, réceptionner leurs messages et leur envoyer
une confirmation à chaque réception. Vous allez rajouter l'utilisation de select pour travailler avec plusieurs
clients.
select va permettre :
 D’écouter plusieurs clients connectés
 De savoir si un (ou plusieurs) clients sont connectés au serveur.
Rappel : la méthode accept est aussi une fonction bloquante.

Maintenant le serveur peut accepter des connexions de plus d'un client et ne se bloque pas dans l'attente d'un
message, du moins pas plus de 50 millisecondes.
Les déconnexions fortuites ne sont pas gérées non plus.

3) Pour aller plus loin :


Regarder la documentation du module socket, de select et de socketserver.
Le module socketserver, propose une alternative pour monter vos applications serveur. Il en existe d'autres. Vous
pouvez utiliser des sockets non bloquants (c'est-à-dire qui ne bloquent pas le programme quand vous utilisez leur
méthode accept ou recv) ou des threads pour exécuter différentes portions de votre programme en parallèle.
6

Vous aimerez peut-être aussi