From 03bf6bae0afd7fe8495b576f80991e9601eae50d Mon Sep 17 00:00:00 2001 From: Katharina <katharina.willig@outlook.com> Date: Sat, 23 Nov 2024 16:41:20 +0100 Subject: [PATCH] election --- __pycache__/kserver.cpython-313.pyc | Bin 3481 -> 3481 bytes kserver.py | 94 ++++++++++++++-------------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/__pycache__/kserver.cpython-313.pyc b/__pycache__/kserver.cpython-313.pyc index 401d92341d7bb4d3c2994fd3d5d394df9ea34069..962c797ea7dc3b5fbdc84680922bf3b07d049d8e 100644 GIT binary patch delta 19 acmbO!JyV+NGcPX}0|NuYvCA8|`gs90kOg`G delta 19 acmbO!JyV+NGcPX}0|NuYhl?Az`gs91f(4=g diff --git a/kserver.py b/kserver.py index 453d229..eaecd0a 100644 --- a/kserver.py +++ b/kserver.py @@ -5,13 +5,10 @@ import uuid broadcast_ip = '255.255.255.255' broadcast_port = 55555 -# create unique server-ID +# Create a unique server ID server_id = str(uuid.uuid4()) -# Set to store UUIDs of other servers -server_uuids = set() - -# create server-socket for broadcast +# Create server socket for broadcasting 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) @@ -19,71 +16,74 @@ server_socket.bind(('', broadcast_port)) print(f"Server is running with ID {server_id} and broadcasting on port {broadcast_port}...") -#broadcast function +# Store the current leader's ID +current_leader = None + +# Broadcast function def broadcast(message): - """sends messages to all server-IDs in the network""" + """Send messages to all other nodes in the network.""" full_message = f"[{server_id}] {message}".encode() server_socket.sendto(full_message, (broadcast_ip, broadcast_port)) -#listener function +# Listener function def listen(): - """receives messages from clients and broadcast them.""" + """Receive messages and implement LCR logic.""" + global current_leader + while True: try: message, client_address = server_socket.recvfrom(4096) decoded_message = message.decode() - # Extract UUID from the message + # Extract sender UUID and payload if decoded_message.startswith("[") and "]" in decoded_message: sender_uuid = decoded_message.split("]")[0][1:] - + payload = decoded_message.split("]")[1].strip() + # Ignore messages from self if sender_uuid == server_id: continue + + # LCR logic + if payload == "START_ELECTION": + print(f"Received election start from {sender_uuid}") + if sender_uuid > server_id: + # Forward the sender's ID + broadcast(f"START_ELECTION {sender_uuid}") + elif sender_uuid < server_id: + # Send own ID into the ring + broadcast(f"START_ELECTION {server_id}") + else: + # If sender_uuid == server_id, we are the leader + current_leader = server_id + broadcast(f"LEADER {server_id}") + print(f"I am the leader: {server_id}") - # Add the UUID to the set if it's not already known - if sender_uuid not in server_uuids: - server_uuids.add(sender_uuid) - print(f"Discovered new server UUID: {sender_uuid} and server set: {server_uuids}") - # print(server_uuids) - - #checks if the message containts the string "entered" - if decoded_message.__contains__("entered"): - print(f"{client_address} entered the chat.") - - print(f"Received from {client_address}: {decoded_message}") - - broadcast(decoded_message) - - #exceptions + elif payload.startswith("LEADER"): + leader_id = payload.split(" ")[1] + current_leader = leader_id + print(f"Leader has been elected: {leader_id}") + except socket.error as e: print(f"An error occurred: {e}") break - #does not work except KeyboardInterrupt: - print("\nServer wird beendet...") + print("\nShutting down server...") break +# Start the election +def start_election(): + """Initiate the LCR election process.""" + print("Starting election...") + broadcast(f"START_ELECTION {server_id}") + if __name__ == "__main__": - #main thread - listen_thread= threading.Thread(target=listen) - #listen_thread.daemon = True + # Start the listener thread + listen_thread = threading.Thread(target=listen) listen_thread.start() - #print(listen_thread.is_alive()) - #listen() - - # Example of broadcasting your UUID periodically (optional) - def periodic_broadcast(): - import time - while True: - try: - broadcast("Server is running") - time.sleep(10) # Broadcast every 5 seconds - except KeyboardInterrupt: - break - - broadcast_thread = threading.Thread(target=periodic_broadcast) - broadcast_thread.daemon = True # Stop when main thread stops - broadcast_thread.start() + # Start election after a short delay + import time + time.sleep(2) + start_election() -- GitLab