diff --git a/clients.py b/clients.py deleted file mode 100644 index 5796a2cd0fc7df9cccd3d3d1135d577c93d49c1b..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..adbffd4374acacac4e58feebdb2c51e6068aeda1 --- /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 0000000000000000000000000000000000000000..3f597a6e70376f750ce44d7c30d530b4c8dccf5a --- /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 3023e87c2dfe8449058fbfb1ec49e00440572fc0..0000000000000000000000000000000000000000 --- 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