Test: server.py formatiert mit dem Tool black, hier als Plugin für vim
This commit is contained in:
parent
59e85a07fa
commit
ff8164de7c
1 changed files with 89 additions and 0 deletions
89
formatted_with_black.server.py
Executable file
89
formatted_with_black.server.py
Executable file
|
@ -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()
|
Loading…
Reference in a new issue