From 4688268bc23dc6095e5aafbbc466afb83f108cf1 Mon Sep 17 00:00:00 2001 From: Quoc Dao <quoc.dao@student.reutlingen-university.de> Date: Sun, 4 Feb 2024 22:14:42 +0100 Subject: [PATCH] chat fix --- client.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- server.py | 16 ++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/client.py b/client.py index 4f1cae8..9ddf7a8 100644 --- a/client.py +++ b/client.py @@ -1,6 +1,8 @@ import socket import threading from datetime import datetime +import time +import struct MULTICAST_GROUP_IP = '224.1.1.1' @@ -64,6 +66,50 @@ class Client(): except socket.timeout: pass + except ConnectionResetError: + # Verbindung zum Leader wurde zurückgesetzt + print("Connection to the leader server was reset. Attempting to reconnect...") + self.server_socket.close() # Schließe die vorhandene Verbindung + time.sleep(1) # Warte eine Sekunde, bevor eine neue Verbindung hergestellt wird + self.connect_to_leader() # Methode aufrufen, um eine Verbindung zum aktuellen Leader herzustellen + + + def connect_to_leader(self): + try: + # Verbindung zum aktuellen Leader herstellen + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.server_socket.connect((self.currentLeader, 5555)) + print("Reconnected to the leader server.") + except Exception as e: + print(f"Failed to reconnect to the leader server: {str(e)}") + + + def listen_for_new_leader(self): + # Socket zum Empfangen von Multicast-Nachrichten erstellen + multicast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) + multicast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + multicast_socket.bind(('', CLIENT_MULTICAST_PORT)) + + # Multicast-Gruppe beitreten + group = socket.inet_aton(MULTICAST_GROUP_IP) + mreq = struct.pack('4sL', group, socket.INADDR_ANY) + multicast_socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) + + while True: + try: + # Nachrichten von potenziellen neuen Leadern empfangen + data, address = multicast_socket.recvfrom(1024) + if data: + new_leader_address = data.decode() + if new_leader_address != self.currentLeader: + print(f"New leader detected: {new_leader_address}") + self.currentLeader = new_leader_address + # Verbindung zum neuen Leader herstellen + self.connect_to_leader() + + except socket.timeout: + pass + def receive_messages(self): while True: @@ -83,5 +129,10 @@ if __name__ == "__main__": client = Client() thread1 = threading.Thread(target = client.MulticastSendAndReceive) + thread2 = threading.Thread(target=client.listen_for_new_leader) + thread1.start() - thread1.join() \ No newline at end of file + thread2.start() + + thread1.join() + thread2.join() \ No newline at end of file diff --git a/server.py b/server.py index 6e1c1eb..714e818 100644 --- a/server.py +++ b/server.py @@ -278,6 +278,19 @@ class Server(): finally: ring_socket.close() + def handle_new_leader(self): + # Funktion, um den neuen Leader zu behandeln und seine IP-Adresse zu senden + multicast_group = (MULTICAST_GROUP_IP, SERVER_MULTICAST_PORT) + multicast_send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + + while True: + # Überprüfe, ob ein neuer Leader gewählt wurde + if self.is_leader: + # Sende die IP-Adresse des Leaders an die Multicast-Gruppe + multicast_send_sock.sendto(self.leader_ip.encode(), multicast_group) + time.sleep(1) # Warte kurz, bevor du die IP-Adresse erneut sendest + + def init_heartbeat(self): self.leader_heartbeat_last_received = time.time() self.heartbeat_interval = 1 # seconds @@ -358,6 +371,9 @@ if __name__== '__main__': thread_heartbeat = threading.Thread(target = server.init_heartbeat) thread_heartbeat.start() + thread_new_leader = threading.Thread(target=server.handle_new_leader) + thread_new_leader.start() + # Socket erstellen und binden server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((MY_IP, 5555)) -- GitLab