Skip to content
Snippets Groups Projects
Commit 2deb5d76 authored by Zanger's avatar Zanger
Browse files

Heartbeat Functions

parent 954d7820
No related branches found
No related tags found
1 merge request!1Heartbeat Functions
...@@ -2,18 +2,19 @@ import multiprocessing ...@@ -2,18 +2,19 @@ import multiprocessing
import socket import socket
import threading import threading
import json import json
import time
client_broadcast_listener_port = 49153 client_broadcast_listener_port = 49153
server_broadcast_listener_port = 49154 server_broadcast_listener_port = 49154
server_heartbeat_tcp_listener_port = 49155
client_receive_chat_tcp_port = 50001 client_receive_chat_tcp_port = 50001
client_forward_message_multicast_port = 51000 client_forward_message_multicast_port = 51000
multicast_group_ip = '224.0.1.1' multicast_group_ip = '224.0.1.1'
class Server(multiprocessing.Process): class Server(multiprocessing.Process):
#server_address = '127.0.0.1' #server_address = '127.0.0.1'
host = socket.gethostname() host = socket.gethostname()
...@@ -39,13 +40,69 @@ class Server(multiprocessing.Process): ...@@ -39,13 +40,69 @@ class Server(multiprocessing.Process):
server_listener_thread = threading.Thread(target=self.listen_for_servers) server_listener_thread = threading.Thread(target=self.listen_for_servers)
server_listener_thread.start() server_listener_thread.start()
heartbeat_send_thread = threading.Thread(target=self.send_heartbeat)
heartbeat_send_thread.start()
else: else:
cache_update_listener_thread = threading.Thread(target=self.listen_for_cache_update) cache_update_listener_thread = threading.Thread(target=self.listen_for_cache_update)
client_message_listener_thread = threading.Thread(target=self.listen_for_client_messages) 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() cache_update_listener_thread.start()
client_message_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 # find highest server ID in cache
def get_last_server_id(self): def get_last_server_id(self):
...@@ -56,7 +113,6 @@ class Server(multiprocessing.Process): ...@@ -56,7 +113,6 @@ class Server(multiprocessing.Process):
# ascii value before A # ascii value before A
return 64 return 64
def listen_for_servers(self): def listen_for_servers(self):
BROADCAST_PORT = 49154 BROADCAST_PORT = 49154
......
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