Réseaux en Python
L'objectif de ce travail est de créer une interface réseau en Python afin de permettre à deux ordinateurs de communiquer via la console Python.
Vous trouverez ainsi:
- le moyen de discuter d'un ordinateur à un autre
- de créer un serveur à destination d'un client
- de créer un serveur à plusieurs clients
- de jouer en réseau au puissance 4
Python et l'interface réseau¶
On peut créer une architecture client/serveur en Python avec les codes suivants. Le principe est représenté par la figure suivante:

Donc en toute logique, il faut d'abord lancer le serveur pour qu'il commence à écouter sur le port défini(50000 ici). Dans le code du client, il faut saisir l'adresse IP de la machine qui joue le rôle de serveur!
#------------------------------------------------------#
# CREATION DU CLIENT #
#------------------------------------------------------#
import socket
adresseIP = "................"# mettre ici l'adresse IP de la machine
# qui contient le serveur
port = 50000 # Connection sur le port 50000
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((adresseIP, port))
client.send("Salut Serveur".encode("utf-8"))
reponse = client.recv(255)
#operation bloquante
print(reponse.decode("utf-8"))
client.close()
#------------------------------------------------------------#
# CREATION DU SERVEUR #
#------------------------------------------------------------#
import socket
serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serveur.bind(('', 50000)) # Écoute sur le port 50000
serveur.listen(5)
while True:
client, adress = serveur.accept()
print("Client connecté. Adresse " + adress[0])
requete = client.recv(255) # en attente du message du client
# cette operation est bloquante!
print(requete.decode("utf-8"))
message = "Bonjour, je suis le serveur."
client.send(message.encode("utf-8"))#envoi au client connecte le message
serveur.close()
Exo
Par groupe de deux, utiliser ces deux programmes pour communiquer dans la console Python. L'un joue le rôle de serveur, l'autre de client.
J'ai une seule machine!
Peut-on installer client et serveur sur la même machine? La réponse est OUI. L'adresse IP du serveur est alors l'adresse de localhost
c'est-à-dire l'adresse 127.0.0.1
.
Mais c'est tout de même plus rigolo de le faire avec une autre machine...
Vous aurez sûrement remarqué que certaines méthodes sont bloquantes: par exemple, on ne peut pas reposer une question tant que le client n'a pas répondu. De plus, les codes proposés ne permettent pas une discussion perpétuelle.
Exo
Modifier les programmes précédents pour permettre une discussion sans fin mais l'un apèrs l'autre. On pourra signifier au serveur la fin de la discussion s'il reçoit le message FIN
.
Nous allons créer (modestement...) un serveur qui fait des maths! Le client propose un couple de nombres et le serveur répond en donnant la somme de ces deux nombres!
Exo
À l'aide des routines précédentes, écrire un code qui permet au client d'envoyer au serveur un couple de nombres sous la forme d'un tuple et le serveur répond en renvoyant au client la somme des deux nombres.
Multiplions les clients¶
Dans une architecture classique, le serveur propose un service à tous les clients potentiels sur le réseau. Nous allons donc créer un serveur qui a la possibilité de répondre à plusieurs clients. Nous allons pour cela utiliser des threads
.
Un fil d'exécution
Un thread
est un fil d'exécution qui permet de parallèliser le traitement d'une tâche.
À chaque connection d'un client, un thread
est créé et a la seule tâche de gérer cette connection. Si le code du client ne change pas , celle du serveur est alors:
import socket
import threading
threadsClients = [] #liste des clients
#--- fonction exécutée par chaque thread ----#
def instanceServeur (client, infosClient):
adresseIP = infosClient[0]
port = str(infosClient[1])
print("Instance de serveur prêt pour " + adresseIP + ":" + port)
message = ""
while message.upper() != "FIN":
message = client.recv(255).decode("utf-8")
print("Message reçu du client " + adresseIP + ":" + port + " : " + message)
client.send("Message reçu".encode("utf-8"))
print("Connexion fermée avec " + adresseIP + ":" + port)
client.close()
#--- création du socket ---#
serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serveur.bind(('', 50000)) # Écoute sur le port 50000
serveur.listen(5)
while True:
client, infosClient = serveur.accept()
# creation du thread et donc de la connection
threadsClients.append(threading.Thread(None, instanceServeur, None, (client, infosClient), {}))
#demarrage du dernier thread stocké dans la liste
threadsClients[-1].start()
serveur.close()
Test du serveur
À plusieurs (trois au moins...), tester ce serveur et apportez-y des modifications selon vos envies.
Maintenant que l'architecture classique fonctionne, revenons à notre serveur d'addition...
Enfin un vrai serveur
En utilisant le code ci-dessus, créer un serveur mathématique (enfin, celui qui fait des additions...) unique pour tous les clients de la salle.
Retour sur le jeu de puissance4¶
Nous avons développer un jeu en puissance4 en python en utilisant la bibliothèque pygame
. Nous allons réinvestir les notions présentées ici afin de proposer une version réseau de ce jeu: un client pour un serveur.
Le serveur initialise le jeu et le client se joint à la partie. C'est donc le serveur qui commence.
Vous trouverez l'ensemble du code ci-après: il fonctionne mais présente quelques bugs. À vous de les corriger afin d'en améliorer la version!