Skip to content
Snippets Groups Projects

Heartbeat Functions

Merged Michael Zanger requested to merge michael into main
1 file
+ 59
3
Compare changes
  • Side-by-side
  • Inline
+ 59
3
@@ -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
Loading