import socket import threading # Server-Informationen HOST = '127.0.0.1' PORT = 12345 # Erstelle den Server-Socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((HOST, PORT)) # Liste für die Verfolgung der Clients clients = [] def sendanall(conn, msg): for client in clients: if client != conn: try: client.sendall(msg.encode('utf-8')) except BrokenPipeError: print("pipe error") pass def handle_client(conn, addr): """ Funktion für das Behandeln eines einzelnen Clients """ nick = conn.recv(1024).decode('utf-8') print(f"Neuer Client verbunden: {addr} (Nickname: {nick})") sendanall(conn, f"{nick} hat den Chat betreten") # Füge den Client zur Liste hinzu clients.append(conn) while True: try: # Empfange die Nachricht des Clients msg = conn.recv(1024).decode('utf-8') if not msg: break elif msg == "exit": print("Client getrennt:", addr) sendanall(conn, f"{nick} hat den Chat verlassen") clients.remove(conn) conn.close() break print(clients) print(f"Nachricht von {addr}: {msg}") # Überprüfe, ob das Socket noch geöffnet ist, bevor Sie versuchen zu senden if conn.fileno() != -1: sendanall(conn, f"<{nick}>:{msg}") except ConnectionResetError: # Wenn eine Verbindungsreset-Ausnahme auftritt (Client beendet ohne "exit" zu senden) print("Client getrennt (Verbindungsreset):", addr) sendanall(conn, f"{nick} hat den Chat verlassen") clients.remove(conn) conn.close() break def start_server(): """ Funktion für das Starten des Servers """ server.listen() print(f'Server läuft auf {HOST}:{PORT}') while True: # Warte auf eingehende Verbindungen conn, addr = server.accept() # Starte einen neuen Thread für jeden Client threading.Thread(target=handle_client, args=(conn, addr)).start() if __name__ == '__main__': try: start_server() except KeyboardInterrupt: print("Server wird heruntergefahren.") server.close()