Socket Python – Serveur avec plusieurs clients
Dans le tutoriel précédent, nous avons parlé du serveur TCP en Python qui accepte et réponde aux demandes d’un seul client TCP. Maintenant, nous allons voir comment créer un serveur Python multithread qui peut fonctionner avec plusieurs clients TCP.
Créer un serveur multithread en Python
Un serveur multithread utilise les modules principaux suivants pour gérer plusieurs connexions client.
- Module « threading » de Python.
- ThreadingMixIn de SocketServer.
La classe ThreadingMixIn permet au serveur Python de créer de nouveaux threads pour prendre en charge chaque nouvelle connexion. Il permet également au programme d’exécuter les threads de manière asynchrone.
Nous allons créer les trois programmes suivantes:
- Serveur.py
- ClientA.py
- ClientB.py
Serveur.py
import socket from threading import Thread from socketserver import ThreadingMixIn class myThread(Thread): def __init__(self,ip,port): Thread.__init__(self) self.ip = ip self.port = port print ("[+] Nouveau thread démarré pour " + ip + ":" + str(port)) def run(self): while True : data = con.recv(2048) print("Le serveur a reçu des données:", data) msg = raw_input("Entrez la réponse du serveur ou exit pour sortir:") if msg == 'exit': break con.send(msg) # Programme du serveur TCP s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('127.0.0.1', 9999)) mythreads = [] while True: s.listen(5) print("Serveur: en attente de connexions des clients TCP ...") (con, (ip,port)) = s.accept() mythread = myThread(ip,port) mythread.start() mythreads.append(mythread) for t in mythreads: t.join()
ClientA.py
import socket msg = input("ClientA: Entrez un message ou exit pour sortir:") s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("127.0.0.1", 9999)) while msg != 'exit': s.send(msg) data = s.recv(2000) print("ClientA a reçu des données:", data) msg = input("Entrez un message pour continuer ou exit pour sortir:") s.close()
ClientB.py
import socket msg = input("ClientB : Entrez un message ou exit pour sortir:") s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("127.0.0.1", 9999)) while msg != 'exit': s.send(msg) data = s.recv(2000) print("ClientB a reçu des données:", data) msg = input("Entrez un message pour continuer ou exit pour sortir:") s.close()
Veuillez exécuter les trois programmes ci-dessus avec la version Python 3. Parce que le code ci-dessus est compatible avec Python 3.