Skip to content
Snippets Groups Projects
Commit 4688268b authored by Quoc Nguyen Dao's avatar Quoc Nguyen Dao
Browse files

chat fix

parent aa616013
No related branches found
No related tags found
No related merge requests found
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
......@@ -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))
......
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