diff --git a/chat_server.py b/chat_server.py deleted file mode 100644 index eddec0f774180e3b4f21eac1fdf9dfb390abfd0b..0000000000000000000000000000000000000000 --- a/chat_server.py +++ /dev/null @@ -1,66 +0,0 @@ -from server import Server -import time -import socket -import re - -if __name__ == '__main__': - # Create an instance of the Server class - server_instance = Server(client_address="", server_id="", server_port=0, server_cache=dict(), clients_cache=dict(), leader=False) - - # Get the broadcast address from the existing server_instance - broadcast_address = server_instance.get_broadcast_address() - - if broadcast_address is None: - print("Failed to obtain broadcast address. Exiting.") - exit(1) - - print(broadcast_address) - - os = Server.get_os_type() - client_address = "" - server_id = "" - server_port = 0 - server_cache = dict() - clients_cache = dict() - - BROADCAST_PORT = 49154 - #BROADCAST_PORT_LISTEN = 49154 - - print("I'm alive") - MSG = bytes("HI MAIN SERVER", 'utf-8') - - broadcast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) - broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - - # Create a separate socket for receiving broadcast messages - # receive_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - # receive_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - # receive_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) - - - if os == "macOS": - broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) - broadcast_socket.sendto(MSG, (broadcast_address, BROADCAST_PORT)) - - # receive_socket.bind((broadcast_address, BROADCAST_PORT_LISTEN)) - else: - broadcast_socket.sendto(MSG, (broadcast_address, BROADCAST_PORT)) - print("Successfully sent message") - - message, server = broadcast_socket.recvfrom(1024) - print("test") - match = re.search(r'\b([A-Za-z])\b$', message.decode('utf-8')) - server_id = match.group(1) - - print('Received message from server: ', message.decode('utf-8')) - - - print("ServerID: ", server_id) - server_instance.server_id = server_id - print("Assigned ServerID: ", server_instance.server_id) - - # You can use the existing server_instance here, no need to create another one - server_instance.start() # Start the server process - - time.sleep(20) \ No newline at end of file diff --git a/main_server.py b/main_server.py deleted file mode 100644 index 74803e0ac33d61436372ba435856f1ebaf3b6e53..0000000000000000000000000000000000000000 --- a/main_server.py +++ /dev/null @@ -1,18 +0,0 @@ -from server import Server -import time - -if __name__ == '__main__': - client_address = "" - server_id = "MAIN" - server_port = 1000 - server_cache = dict() - clients_cache = dict() - - # Create the Server process - server = Server(client_address, server_id, server_port, server_cache, clients_cache, leader=True) - - # Start the Server process - server.start() - - # Wait indefinitely until the server process completes its execution - server.join() diff --git a/server.py b/server.py index 32e3e8aee1256e7a768f4c539ec080763d7e88ef..b8e772464de00656df06b77b3a4e002dfbccb85e 100644 --- a/server.py +++ b/server.py @@ -7,6 +7,7 @@ import ipaddress import netifaces as ni import platform import uuid +import re client_broadcast_listener_port = 49153 server_broadcast_listener_port = 49154 @@ -32,7 +33,7 @@ class Server(multiprocessing.Process): local_clients_cache = dict() local_group_cache = dict() - def __init__(self, client_address, server_id, server_port, server_cache, clients_cache, leader): + def __init__(self): super(Server, self).__init__() self.os = self.get_os_type() print(self.os) @@ -40,12 +41,6 @@ class Server(multiprocessing.Process): self.server_address = self.get_local_ip_address() self.subnet_mask = self.get_subnet_mask(self.active_interface) print(self.active_interface) - self.leader = leader - self.client_address = client_address - self.server_id = server_id - self.server_port = server_port - self.local_servers_cache = server_cache - self.local_clients_cache = clients_cache self.last_heartbeat_timestamp = last_heartbeat_timestamp self.ring_socket = ring_socket if self.os == "macOS": @@ -127,8 +122,62 @@ class Server(multiprocessing.Process): @staticmethod def generate_server_uuid(): return str(uuid.uuid4()) - + def run(self): + print("I'm alive") + + # Get the broadcast address from the existing server_instance + broadcast_address = self.get_broadcast_address() + if broadcast_address is None: + print("Failed to obtain broadcast address. Exiting.") + exit(1) + + # determine the os type + os = self.get_os_type() + + BROADCAST_PORT = 49154 + MSG = bytes("HI MAIN SERVER", 'utf-8') + + broadcast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) + broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + broadcast_socket.settimeout(2) + + received_response = False + + # try 5 times to find the MAIN server, otherwise declares as new MAIN + for i in range(0,5): + print("Trying to find other servers...") + + if os == "macOS": + broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + broadcast_socket.sendto(MSG, (broadcast_address, BROADCAST_PORT)) + else: + broadcast_socket.sendto(MSG, (broadcast_address, BROADCAST_PORT)) + + try: + message, server = broadcast_socket.recvfrom(1024) + server_response = message.decode('utf-8') + except socket.timeout: + #print("No answer from MAIN server") + pass + else: + if server_response: + match = re.search(r'\b([A-Za-z])\b$', message.decode('utf-8')) + self.server_id = match.group(1) + print('Received message from server: ', message.decode('utf-8')) + received_response = True + self.run_funcs() + break + + broadcast_socket.close() + # no response from MAIN server? declare as new MAIN server + if not received_response: + print("No other server was found, declare as MAIN server.") + self.server_id = "MAIN" + self.run_funcs() + + def run_funcs(self): print(self.server_id+": "+"Up and running") if self.server_id == "MAIN": client_listener_thread = threading.Thread(target=self.listen_for_clients) @@ -312,6 +361,9 @@ class Server(multiprocessing.Process): else: # ascii value before A return 64 + + def register_server(self): + return # listen for servers if they want to join the DS def listen_for_servers(self): @@ -354,42 +406,20 @@ class Server(multiprocessing.Process): update_cache_thread.run() else: update_cache_thread.start() - - # def register_server(self, addr, server_id): - # BROADCAST_ADDRESS = self.get_broadcast_address() - # message = 'Hi ' + addr[0] + ' this is your chat-group ID: ' + str(server_id) - # server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - # if self.os == "macOS": - # server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) - # server_socket.connect((BROADCAST_ADDRESS, 49154)) - - # print(self.server_port) - # else: - # server_socket.connect(('<broadcast>', self.server_port)) - - # server_socket.sendto(str.encode(message), addr) - # server_socket.close() def register_server(self, addr, server_id): message = 'Hi ' + addr[0] + ' this is your chat-group ID: ' + str(server_id) server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - #server_socket.connect((self.server_address, self.server_port)) server_socket.connect((addr[0], addr[1])) server_socket.sendto(str.encode(message), addr) print(server_socket) server_socket.close() - - def listen_for_clients(self): BROADCAST_PORT = 49153 BROADCAST_ADDRESS = self.get_broadcast_address() - # Local host information - #MY_HOST = socket.gethostname() - #MY_IP = socket.gethostbyname(MY_HOST) - # Create a UDP socket listen_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Set the socket to broadcast and enable reusing addresses @@ -452,9 +482,10 @@ class Server(multiprocessing.Process): return addr def send_reply_to_client(self, server_addr, client_addr): + PORT = 1000 message = 'Hi ' + client_addr[0] + ' this is your groupchat server: ' + server_addr server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - server_socket.connect((self.server_address, self.server_port)) + server_socket.connect((self.server_address, PORT)) server_socket.sendto(str.encode(message), client_addr) server_socket.close() @@ -481,17 +512,6 @@ class Server(multiprocessing.Process): if value == addr[0]: group = key[0] return group - - # Create and run new server - def create_server(self, server_id, client_address): - - self.server_port = self.server_port + 1 - - new_server = Server(client_address, server_id, self.server_port, self.local_servers_cache, self.local_clients_cache) - - #new_server.send_reply_to_client() - - return self.server_port # send updated group view/servers cache to all server @@ -758,7 +778,7 @@ class Server(multiprocessing.Process): # reassign the groupchats of the old MAIN server to the new MAIN server self.reassign_chat_groups(self.server_id) self.stop_threads() - self.run() + self.run_funcs() def stop_threads(self): self.keep_running_nonLeader = False diff --git a/start_server.py b/start_server.py new file mode 100644 index 0000000000000000000000000000000000000000..cdede872c7a41ce7a05e5c60319f0c6b051e2261 --- /dev/null +++ b/start_server.py @@ -0,0 +1,13 @@ +from server import Server +import time + +if __name__ == '__main__': + + # Create the Server instance + server = Server() + + # Start the Server process + server.start() + + # Wait indefinitely until the server process completes its execution + server.join()