From 7fe791a2f1348e62453f660c1694d541962c1500 Mon Sep 17 00:00:00 2001
From: Katharina <katharina.willig@outlook.com>
Date: Sun, 17 Nov 2024 23:16:07 +0100
Subject: [PATCH] add working code, client and server
---
clients.py | 32 --------------------------------
kclient.py | 45 +++++++++++++++++++++++++++++++++++++++++++++
kserver.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
server.py | 52 ----------------------------------------------------
4 files changed, 93 insertions(+), 84 deletions(-)
delete mode 100644 clients.py
create mode 100644 kclient.py
create mode 100644 kserver.py
delete mode 100644 server.py
diff --git a/clients.py b/clients.py
deleted file mode 100644
index 5796a2c..0000000
--- a/clients.py
+++ /dev/null
@@ -1,32 +0,0 @@
-import socket
-import threading
-
-nickname=input("Choose a mickname: ")
-
-client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-client.connect(('127.0.0.1', 55555))
-
-def receive():
- while True:
- try:
- message=client.recv(1024).decode()
- if message=='NICK':
- client.send(nickname.encode())
- else:
- print(message)
- except:
- print("An error occured")
- client.close()
- break
-
-def write():
- while True:
- message=f'{nickname}: {input("")}'#as soon as user clicks enter and sends new input, we're asking for the next one, so either close client or send new messages
- client.send(message.encode())
-
-#run receive and write threat
-receive_thread=threading.Thread(target=receive)
-receive_thread.start()
-
-write_thread=threading.Thread(target=write)
-write_thread.start()
\ No newline at end of file
diff --git a/kclient.py b/kclient.py
new file mode 100644
index 0000000..adbffd4
--- /dev/null
+++ b/kclient.py
@@ -0,0 +1,45 @@
+import socket
+import threading
+
+broadcast_ip = '255.255.255.255'
+broadcast_port = 55555
+
+# Erstelle den Client-Socket für 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
+
+nickname = input("Enter your nickname: ")
+
+def receive():
+ """Empfängt Nachrichten vom Server und anderen Clients."""
+ while True:
+ try:
+ data, _ = client_socket.recvfrom(4096)
+ decoded_message = data.decode()
+
+ # Ignoriere Nachrichten mit Server-Kennung
+ if decoded_message.startswith("["):
+ continue
+
+ print(decoded_message)
+ except socket.error as e:
+ print(f"An error occurred: {e}")
+ break
+
+def write():
+ """Ermöglicht dem Benutzer, Nachrichten zu schreiben und zu senden."""
+ while True:
+ message = input("")
+ if message.strip():
+ 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()
+
+# Starte die write-Funktion im Hauptthread
+write()
diff --git a/kserver.py b/kserver.py
new file mode 100644
index 0000000..3f597a6
--- /dev/null
+++ b/kserver.py
@@ -0,0 +1,48 @@
+import socket
+import threading
+import uuid
+
+broadcast_ip = '255.255.255.255'
+broadcast_port = 55555
+
+# Erstelle eine eindeutige Server-ID
+server_id = str(uuid.uuid4())
+
+# Erstelle den Server-Socket für 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)
+server_socket.bind(('', broadcast_port))
+
+print(f"Server is running with ID {server_id} and broadcasting on port {broadcast_port}...")
+
+def broadcast(message):
+ """Sendet eine Nachricht an alle im Netzwerk mit Server-ID."""
+ 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."""
+ while True:
+ try:
+ message, client_address = server_socket.recvfrom(4096)
+ decoded_message = message.decode()
+
+ # Prüfe, ob die Nachricht vom Server selbst stammt
+ if decoded_message.startswith(f"[{server_id}]"):
+ continue # Ignoriere die Nachricht, wenn sie vom Server selbst stammt
+
+ print(f"Received from {client_address}: {decoded_message}")
+
+ # Broadcast die Nachricht an alle Clients
+ broadcast(decoded_message)
+
+ except socket.error as e:
+ print(f"An error occurred: {e}")
+ break
+ except KeyboardInterrupt:
+ print("\nServer wird beendet...")
+ break
+
+if __name__ == "__main__":
+ receive()
diff --git a/server.py b/server.py
deleted file mode 100644
index 3023e87..0000000
--- a/server.py
+++ /dev/null
@@ -1,52 +0,0 @@
-import socket
-import threading
-
-host='127.0.0.1'
-port=55555
-
-print(f'Server ist listening on {host} and port {port}')
-
-server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-server.bind((host, port))
-server.listen()
-
-clients=[]
-nicknames=[]
-
-def broadcast(message):
- for client in clients:
- client.send(message)
-
-def handle(client):
- while True:
- try:
- message=client.recv(1024)
- broadcast(message)
- except:
- index=clients.index(client)
- clients.remove(client)
- client.close()
- nickname=nicknames[index]
- broadcast(f'{nickname} left the chat'.encode())
- nicknames.remove(nickname)
- break
-
-def receive():
-
- while True:
- client, address=server.accept() #accept clients all the time
- print(f"Connected with {str(address)}")
-
- client.send('NICK'.encode()) #send to client keyword NICK
- nickname=client.recv(1024).decode() #receive nickname from client
- nicknames.append(nickname) #append nickname to list
- clients.append(client) #append client to list
-
- print(f'Nickname of client ist {nickname}')
- broadcast(f'{nickname} joined the chat'.encode()) #broadcast to all clients connected to server
- client.send("Connected to the server".encode()) #send to particular client that connection was successfull
-
- thread=threading.Thread(target=handle, args=(client,)) #start a thread, which handles the connection with this particular client
- thread.start()
-
-receive()
\ No newline at end of file
--
GitLab