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
from threading import Thread
from socketserver import ThreadingMixIn
def __init__(self,ip,port):
print ("[+] Nouveau thread démarré pour " + ip + ":" + str(port))
print("Le serveur a reçu des données:", data)
msg = raw_input("Entrez la réponse du serveur ou exit pour sortir:")
# 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))
print("Serveur: en attente de connexions des clients TCP ...")
(con, (ip,port)) = s.accept()
mythread = myThread(ip,port)
mythreads.append(mythread)
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()
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
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))
print("ClientA a reçu des données:", data)
msg = input("Entrez un message pour continuer ou exit pour sortir:")
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()
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
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))
print("ClientB a reçu des données:", data)
msg = input("Entrez un message pour continuer ou exit pour sortir:")
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()
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.
QCMs qui pourraient vous intéresser :