diff --git a/formatted_with_black.server.py b/formatted_with_black.server.py new file mode 100755 index 0000000..56f4d2f --- /dev/null +++ b/formatted_with_black.server.py @@ -0,0 +1,89 @@ +#!/usr/bin/python3 + +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("Verbindung verloren.") + with lock: + clients.remove((conn, nick)) + conn.close() + break + + +def handle_client(conn, addr): + nick = conn.recv(1024).decode("utf-8") + print(f"Neuer Client verbunden: {addr} ({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} ({nick}): {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()