# server import socket import threading clients = [] lock = threading.Lock() def broadcast(message, sender_socket=None): with lock: for client_socket, pseudo in clients: if client_socket != sender_socket: try: client_socket.send(message.encode()) except: pass def handle_client(client_socket, client_address): pseudo = client_socket.recv(4096).decode().strip() with lock: clients.append((client_socket, pseudo)) print(f"{pseudo} ({client_address}) a rejoint le chat.") broadcast(f"[{pseudo} a rejoint le chat]", sender_socket=client_socket) while True: try: message = client_socket.recv(4096).decode() if not message or message.lower() == "quit": break print(f"{pseudo} : {message}") broadcast(f"{pseudo} : {message}", sender_socket=client_socket) except: break with lock: clients.remove((client_socket, pseudo)) client_socket.close() print(f"{pseudo} a quitté le chat.") broadcast(f"[{pseudo} a quitté le chat]") server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind(("localhost", 9999)) server_socket.listen(5) print("Serveur de chat multi-utilisateurs démarré sur le port 9999...") while True: client_socket, client_address = server_socket.accept() thread = threading.Thread(target=handle_client, args=(client_socket, client_address)) thread.start()