diff --git a/kclient.py b/kclient.py index 36507079db3e3c9afd814c8d2c2555a77126e9ff..833815a6c9f445f71cd3e5004eccee6316c75a07 100644 --- a/kclient.py +++ b/kclient.py @@ -56,6 +56,7 @@ def sender(): #print("send message to", broadcast_port) #checks for whitemarks if message.strip(): + full_message = f"{message_id}: {nickname}: {message}".encode() client_socket.sendto(full_message, (broadcast_ip, broadcast_port)) #print("message sended to", broadcast_port) diff --git a/server.py b/server.py index 8e23e62d8cd9238f48812e0500e5d9a63525ac3e..613bfbec4e9125b670b6c7525169937a7ee2002e 100644 --- a/server.py +++ b/server.py @@ -1,3 +1,7 @@ +##########unsicher, ob heartbeat funktioniert################ +###########deutsch englisch korrigieren################### +################liste mit message ids auf 3-5 setzen######## + import socket import multiprocessing import uuid @@ -82,7 +86,7 @@ def listen_client(shared_data): #global received_messages received_messages = set() - + #save_last_messages = manager.dict() #message_queue = multiprocessing.Queue(maxsize=3) @@ -196,7 +200,9 @@ def start_election(queue, shared_data): elif "LEADER" in message: leader_uuid = message.split(": ")[1] shared_data['current_leader'] = leader_uuid + #time.sleep(1) # Delay to ensure all processes are aware of the leader print(f"(leader) Leader elected: {shared_data['current_leader']}") + leader_election_done.set() # Signal, dass die Leaderwahl abgeschlossen ist return except multiprocessing.queues.Empty: @@ -230,12 +236,17 @@ def start_election(queue, shared_data): # Heartbeat function def send_heartbeat(shared_data): """Sends heartbeat messages to keep the server active.""" + leader_election_done.wait() # Blockiert, bis die Leaderwahl abgeschlossen ist + print(f"Heartbeat function started. Leader: {shared_data['current_leader']}, Server ID: {shared_data['server_id']}") #only if you are the current leader if shared_data['current_leader'] == shared_data['server_id']: - time.sleep(30) #waiting for leader election #set to 20s + #time.sleep(10) #waiting for leader election #set to 20s while True: - broadcast_election(f"HEARTBEAT: {shared_data['server_id']}") #please change that to right neighbour after correct leader election - time.sleep(5) + try: + broadcast_election(f"HEARTBEAT: {shared_data['server_id']}") #please change that to right neighbour after correct leader election + time.sleep(5) + except socket.error as e: + print(f"Failed to send heartbeat: {e}") # Monitor heartbeats def monitor_heartbeats(): @@ -255,6 +266,7 @@ if __name__ == "__main__": multiprocessing.freeze_support() print(f"Script started with PID: {os.getpid()}") + leader_election_done = threading.Event() # Manager for shared data manager = Manager() @@ -274,14 +286,13 @@ if __name__ == "__main__": #listener_election_process = multiprocessing.Process(target=listen_broadcast_election, args=(message_queue, shared_data)) listener_client_process = multiprocessing.Process(target=listen_client, args=(shared_data,)) election_process = multiprocessing.Process(target=start_election, args=(message_queue, shared_data)) + # Start the listener for clients in a thread + listener_election_thread = threading.Thread(target=listen_broadcast_election, args=(message_queue, shared_data), daemon=True) # Heartbeat threads heartbeat_thread = threading.Thread(target=send_heartbeat, args=(shared_data,), daemon=True) heartbeat_monitor_thread = threading.Thread(target=monitor_heartbeats, daemon=True) - # Start the listener for clients in a thread - listener_election_thread = threading.Thread(target=listen_broadcast_election, args=(message_queue, shared_data), daemon=True) - # Start processes and threads #listener_election_process.start() listener_client_process.start()