import socket import threading HOST = '0.0.0.0' PORT = 12345 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((HOST, PORT)) clients = [] lock = threading.Lock() def send_to_all(conn, msg): with lock: for client, _ in clients: if client != conn: try: client.sendall(msg.encode('utf-8')) except BrokenPipeError: print("Broken Pipe Error") pass def handle_client(conn, addr): nick = conn.recv(1024).decode('utf-8') print(f"Neuer Client verbunden: {addr} (Nickname: {nick})") send_to_all(conn, f"{nick} hat den Chat betreten") with lock: clients.append((conn, nick)) while True: try: msg = conn.recv(1024).decode('utf-8') if not msg: break elif msg == "exit": print("Client getrennt:", addr) send_to_all(conn, f"{nick} hat den Chat verlassen") with lock: clients.remove((conn, nick)) conn.close() break print(clients) print(f"Nachricht von {addr}: {msg}") if conn.fileno() != -1: send_to_all(conn, f"<{nick}>:{msg}") except ConnectionResetError: print("Client getrennt (Verbindungsreset):", addr) send_to_all(conn, f"{nick} hat den Chat verlassen") with lock: clients.remove((conn, nick)) conn.close() break def start_server(): server.listen() print(f'Server läuft auf {HOST}:{PORT}') while True: conn, addr = server.accept() threading.Thread(target=handle_client, args=(conn, addr)).start() if __name__ == '__main__': try: start_server() except KeyboardInterrupt: print("Server wird heruntergefahren.") with lock: for client, nick in clients: send_to_all(client, f"{nick} hat den Chat verlassen") client.close() server.close()