From e092cdeeb0a1da7a79b1c93bc7244a93b182e958 Mon Sep 17 00:00:00 2001 From: Katharina <katharina.willig@outlook.com> Date: Wed, 20 Nov 2024 23:18:42 +0100 Subject: [PATCH] add threads and comments --- kclient.py | 34 +++++++++++++++++++++------------- kserver.py | 33 +++++++++++++++++++++------------ 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/kclient.py b/kclient.py index 9e537d6..cd9f020 100644 --- a/kclient.py +++ b/kclient.py @@ -1,7 +1,7 @@ import socket import threading -broadcast_ip = '255.255.255.255'#ip ggfs ändern +broadcast_ip = '255.255.255.255'#change ip??? #hard coded? broadcast_port = 55555 #local host information @@ -10,16 +10,16 @@ MY_HOST = socket.gethostname() MY_IP = socket.gethostbyname(MY_HOST) #print(f"host:{MY_HOST} and ip: {MY_IP}") -# Erstelle den Client-Socket für Broadcast +# create client-socket for broadcast client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) -client_socket.bind(('', broadcast_port)) # Lausche auf Broadcast-Port +client_socket.bind(('', broadcast_port)) # listen on broadcast-port #nickname = input("Enter your nickname: ") -def receive(): - """Empfängt Nachrichten vom Server und anderen Clients.""" +def listen(): + """receives messages from server and clients.""" while True: try: data, address = client_socket.recvfrom(4096) @@ -38,24 +38,32 @@ def receive(): print(f"An error occurred: {e}") break -def write(): +def sender(): """Ermöglicht dem Benutzer, Nachrichten zu schreiben und zu senden.""" nickname = input("Enter your nickname: ") just_nickname= f"{nickname} entered the chat".encode() client_socket.sendto(just_nickname, (broadcast_ip, broadcast_port)) while True: + #allows the client to send any message message = input("") + #checks for whitemarks if message.strip(): - full_message = f"{nickname}: {message}".encode()#entered the chat? + full_message = f"{nickname}: {message}".encode() client_socket.sendto(full_message, (broadcast_ip, broadcast_port)) -# Starte den receive-Thread -receive_thread = threading.Thread(target=receive) -receive_thread.daemon = True -receive_thread.start() +# starts listen-thread +listen_thread = threading.Thread(target=listen) +#Daemon Thread does not block the main thread from exiting and continues to run in the background +listen_thread.daemon = True +listen_thread.start() +#print(listen_thread.is_alive()) -# Starte die write-Funktion im Hauptthread -write() +# starts sender-function in main thread +#sender() +sender_thread= threading.Thread(target=sender) +#sender_thread.daemon = True +sender_thread.start() +#print(sender_thread.is_alive()) diff --git a/kserver.py b/kserver.py index b3b5dee..b82846d 100644 --- a/kserver.py +++ b/kserver.py @@ -5,10 +5,10 @@ import uuid broadcast_ip = '255.255.255.255' broadcast_port = 55555 -# Erstelle eine eindeutige Server-ID +# create unique server-ID server_id = str(uuid.uuid4()) -# Erstelle den Server-Socket für Broadcast +# create server-socket for broadcast server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) @@ -16,38 +16,47 @@ server_socket.bind(('', broadcast_port)) print(f"Server is running with ID {server_id} and broadcasting on port {broadcast_port}...") +#broadcast function def broadcast(message): - """Sendet eine Nachricht an alle im Netzwerk mit Server-ID an Server.""" + """sends messages to all server-IDs in the network""" full_message = f"[{server_id}] {message}".encode() server_socket.sendto(full_message, (broadcast_ip, broadcast_port)) -def receive(): - """Empfängt Nachrichten von Clients und broadcastet sie weiter.""" +#listener function +def listen(): + """receives messages from clients and broadcast them.""" while True: try: message, client_address = server_socket.recvfrom(4096) decoded_message = message.decode() - # Prüfe, ob die Nachricht vom Server selbst stammt + # checks wheter the message comes from the server itself if decoded_message.startswith(f"[{server_id}]"): - continue # Ignoriere die Nachricht, wenn sie vom Server selbst stammt - + continue # if...ignores it + + #checks if the message containts the string "entered" if decoded_message.__contains__("entered"): print(f"{client_address} entered the chat.") print(f"Received from {client_address}: {decoded_message}") - # Broadcast die Nachricht an alle Clients außer dem Sender - #if server_id!=client_address: broadcast(decoded_message) - + #exceptions except socket.error as e: print(f"An error occurred: {e}") break + + #does not work except KeyboardInterrupt: print("\nServer wird beendet...") break if __name__ == "__main__": - receive() + #main thread + listen_thread= threading.Thread(target=listen) + #listen_thread.daemon = True + listen_thread.start() + #print(listen_thread.is_alive()) + #listen() + -- GitLab