Skip to content
Snippets Groups Projects
Commit e092cdee authored by Katharina's avatar Katharina
Browse files

add threads and comments

parent b3bc1394
No related branches found
No related tags found
No related merge requests found
import socket import socket
import threading import threading
broadcast_ip = '255.255.255.255'#ip ggfs ändern broadcast_ip = '255.255.255.255'#change ip??? #hard coded?
broadcast_port = 55555 broadcast_port = 55555
#local host information #local host information
...@@ -10,16 +10,16 @@ MY_HOST = socket.gethostname() ...@@ -10,16 +10,16 @@ MY_HOST = socket.gethostname()
MY_IP = socket.gethostbyname(MY_HOST) MY_IP = socket.gethostbyname(MY_HOST)
#print(f"host:{MY_HOST} and ip: {MY_IP}") #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 = 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_BROADCAST, 1)
client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 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: ") #nickname = input("Enter your nickname: ")
def receive(): def listen():
"""Empfängt Nachrichten vom Server und anderen Clients.""" """receives messages from server and clients."""
while True: while True:
try: try:
data, address = client_socket.recvfrom(4096) data, address = client_socket.recvfrom(4096)
...@@ -38,24 +38,32 @@ def receive(): ...@@ -38,24 +38,32 @@ def receive():
print(f"An error occurred: {e}") print(f"An error occurred: {e}")
break break
def write(): def sender():
"""Ermöglicht dem Benutzer, Nachrichten zu schreiben und zu senden.""" """Ermöglicht dem Benutzer, Nachrichten zu schreiben und zu senden."""
nickname = input("Enter your nickname: ") nickname = input("Enter your nickname: ")
just_nickname= f"{nickname} entered the chat".encode() just_nickname= f"{nickname} entered the chat".encode()
client_socket.sendto(just_nickname, (broadcast_ip, broadcast_port)) client_socket.sendto(just_nickname, (broadcast_ip, broadcast_port))
while True: while True:
#allows the client to send any message
message = input("") message = input("")
#checks for whitemarks
if message.strip(): 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)) client_socket.sendto(full_message, (broadcast_ip, broadcast_port))
# Starte den receive-Thread # starts listen-thread
receive_thread = threading.Thread(target=receive) listen_thread = threading.Thread(target=listen)
receive_thread.daemon = True #Daemon Thread does not block the main thread from exiting and continues to run in the background
receive_thread.start() listen_thread.daemon = True
listen_thread.start()
#print(listen_thread.is_alive())
# Starte die write-Funktion im Hauptthread # starts sender-function in main thread
write() #sender()
sender_thread= threading.Thread(target=sender)
#sender_thread.daemon = True
sender_thread.start()
#print(sender_thread.is_alive())
...@@ -5,10 +5,10 @@ import uuid ...@@ -5,10 +5,10 @@ import uuid
broadcast_ip = '255.255.255.255' broadcast_ip = '255.255.255.255'
broadcast_port = 55555 broadcast_port = 55555
# Erstelle eine eindeutige Server-ID # create unique server-ID
server_id = str(uuid.uuid4()) 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 = 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_BROADCAST, 1)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
...@@ -16,38 +16,47 @@ server_socket.bind(('', broadcast_port)) ...@@ -16,38 +16,47 @@ server_socket.bind(('', broadcast_port))
print(f"Server is running with ID {server_id} and broadcasting on port {broadcast_port}...") print(f"Server is running with ID {server_id} and broadcasting on port {broadcast_port}...")
#broadcast function
def broadcast(message): 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() full_message = f"[{server_id}] {message}".encode()
server_socket.sendto(full_message, (broadcast_ip, broadcast_port)) server_socket.sendto(full_message, (broadcast_ip, broadcast_port))
def receive(): #listener function
"""Empfängt Nachrichten von Clients und broadcastet sie weiter.""" def listen():
"""receives messages from clients and broadcast them."""
while True: while True:
try: try:
message, client_address = server_socket.recvfrom(4096) message, client_address = server_socket.recvfrom(4096)
decoded_message = message.decode() 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}]"): 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"): if decoded_message.__contains__("entered"):
print(f"{client_address} entered the chat.") print(f"{client_address} entered the chat.")
print(f"Received from {client_address}: {decoded_message}") 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) broadcast(decoded_message)
#exceptions
except socket.error as e: except socket.error as e:
print(f"An error occurred: {e}") print(f"An error occurred: {e}")
break break
#does not work
except KeyboardInterrupt: except KeyboardInterrupt:
print("\nServer wird beendet...") print("\nServer wird beendet...")
break break
if __name__ == "__main__": 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()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment