From 2deb5d76ea7cad1ff728a2ffc0b47d846514b428 Mon Sep 17 00:00:00 2001 From: Zanger <MZanger@uhlsport.com> Date: Mon, 8 Jan 2024 10:24:10 +0100 Subject: [PATCH] Heartbeat Functions --- server.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/server.py b/server.py index b5554fd..e7be751 100644 --- a/server.py +++ b/server.py @@ -2,18 +2,19 @@ import multiprocessing import socket import threading import json +import time client_broadcast_listener_port = 49153 server_broadcast_listener_port = 49154 +server_heartbeat_tcp_listener_port = 49155 + client_receive_chat_tcp_port = 50001 client_forward_message_multicast_port = 51000 multicast_group_ip = '224.0.1.1' - - class Server(multiprocessing.Process): #server_address = '127.0.0.1' host = socket.gethostname() @@ -39,13 +40,69 @@ class Server(multiprocessing.Process): server_listener_thread = threading.Thread(target=self.listen_for_servers) server_listener_thread.start() + + heartbeat_send_thread = threading.Thread(target=self.send_heartbeat) + heartbeat_send_thread.start() else: cache_update_listener_thread = threading.Thread(target=self.listen_for_cache_update) client_message_listener_thread = threading.Thread(target=self.listen_for_client_messages) + heartbeat_receive_thread = threading.Thread(target=self.listen_for_heartbeats) cache_update_listener_thread.start() client_message_listener_thread.start() + heartbeat_receive_thread.start() + + def send_heartbeat(self): + while True: + time.sleep(10) + for server_id, server_port in self.local_servers_cache.items(): + if server_id != self.server_id: + acknowledgment_received = self.send_heartbeat_to_server(self.server_address, server_heartbeat_tcp_listener_port) + #acknowledgment_received = "YES" + if acknowledgment_received: + print(f"Heartbeat acknowledgment received from {server_id}") + else: + print(f"No acknowledgment received from {server_id}. Server may be down.") + + def send_heartbeat_to_server(self, server_address, server_port): + acknowledgment_received = False + try: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.settimeout(2) # Timeout for the connection + # Combine server address and port into a tuple + server_address_with_port = (server_address, server_port) + print("server_address_with_port", server_address_with_port) + s.connect(server_address_with_port) + s.sendall(b'HEARTBEAT') + acknowledgment = s.recv(1024) + if acknowledgment == b'ACK': + acknowledgment_received = True + except socket.error: + pass # Error handling for connection errors or timeout + return acknowledgment_received + + + def listen_for_heartbeats(self): + while True: + try: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind((self.server_address, server_heartbeat_tcp_listener_port)) # Bind to any available port + actual_port = s.getsockname()[1] + print(f"Heartbeat Listener Started on port {actual_port}") + s.listen() + conn, addr = s.accept() + with conn: + print("Hallo") + data = conn.recv(1024) + if data == b'HEARTBEAT': + # Hier Code zum Verarbeiten des Heartbeats + # (z.B., Aktualisieren des Zeitstempels für den letzten Heartbeat) + print(f"Heartbeat received from {addr}") + # Hier Code zum Senden des Acknowledgment + conn.sendall(b'ACK') + except socket.error as e: + print(f"Error: {e}") # find highest server ID in cache def get_last_server_id(self): @@ -56,7 +113,6 @@ class Server(multiprocessing.Process): # ascii value before A return 64 - def listen_for_servers(self): BROADCAST_PORT = 49154 -- GitLab