diff --git a/Game Server/.env b/Game Server/.env index ffe3ac9..56fba80 100644 --- a/Game Server/.env +++ b/Game Server/.env @@ -1,3 +1,4 @@ HOST="127.0.0.1" -PORT=54321 +TCPPORT=54322 +UDPPORT=54323 ENV="DEV" \ No newline at end of file diff --git a/Game Server/Classes/System/Network/NetworkManger.py b/Game Server/Classes/System/Network/NetworkManger.py index c002254..7c4bedc 100644 --- a/Game Server/Classes/System/Network/NetworkManger.py +++ b/Game Server/Classes/System/Network/NetworkManger.py @@ -12,7 +12,7 @@ class NetworkManager: __BufferSize:int = 1024 __udpSocket:socket __users:list - __eventHandler: list + __eventHandler: UDPEventHandler __UDPClientThread:threading.Thread def __init__(self, Addr:str, Port:str): @@ -23,20 +23,10 @@ class NetworkManager: self.__eventHandler = {} self.__udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.__udpSocket.bind((self.__Addr, self.__Port)) - - self.__UDPClientThread = threading.Thread(target=self.accept_connections) - self.__UDPClientThread.start() - def accept_connections(self): - while True: - client_udp_socket, client_address = self.__udpSocket.accept() - print(f"Connected with {client_address}") - - self.__users[client_address] = client_udp_socket - self.__eventHandler[client_address] = TCPEventHandler(client_udp_socket) - - client_handler_thread = threading.Thread(target=self.receive, args=(client_udp_socket, client_address)) - client_handler_thread.start() + # Starten eines Threads für das Empfangen von UDP-Daten + self.__UDPClientThread = threading.Thread(target=self.receive) + self.__UDPClientThread.start() # handles incomming udp data def receive(self): @@ -67,7 +57,7 @@ class NetworkManager: __BufferSize:int = 1024 __tcpSocket:socket __users:list - __eventHandler: list + __eventHandler: TCPEventHandler __TCPClientThread:threading.Thread def __init__(self, Addr:str, Port:str): @@ -78,41 +68,62 @@ class NetworkManager: self.__eventHandler = {} self.__tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.__tcpSocket.bind((self.__Addr, self.__Port)) + self.__tcpSocket.listen(2) self.__TCPClientThread = threading.Thread(target=self.accept_connections) self.__TCPClientThread.start() def accept_connections(self): while True: - client_tcp_socket, client_address = self.__tcpSocket.accept() - print(f"Connected with {client_address}") - self.__users[client_address] = client_tcp_socket - self.__eventHandler[client_address] = TCPEventHandler(client_tcp_socket) - client_handler_thread = threading.Thread(target=self.receive, args=(client_tcp_socket, client_address)) - client_handler_thread.start() + try: + client_tcp_socket, client_address = self.__tcpSocket.accept() + print(f"Connected with {client_address}") + self.__users[client_address] = client_tcp_socket + self.__eventHandler[client_address] = TCPEventHandler(client_tcp_socket) + client_handler_thread = threading.Thread( + target=self.receive, + args=(client_tcp_socket, client_address) + ) + client_handler_thread.start() + except Exception as e: + print(f"tcp socket failed to accept connection due to error: {e}") + pass - # handles incomming udp data - def receive(self): + def receive(self, client_socket, client_address): while True: - data, address = self.__tcpSocket.recvfrom(self.__BufferSize) - message = data.decode() - messageJson = json.loads(message) - user = messageJson.get("user") + try: + data = client_socket.recv(self.__BufferSize) + if not data: + print(f"Connection with {client_address} closed.") + break # Verbindung geschlossen, Schleife beenden - if user not in self.__users: - self.__users[user] = address # Storing new user in dictionary + message = data.decode() + messageJson = json.loads(message) + user = messageJson.get("user") - # Process the message and handle accordingly - self.__eventHandler.handleTCPEvents(messageJson) - print(f"Received message from {address}: {message}") + if user not in self.__users: + self.__users[user] = client_address + + self.__eventHandler[client_address].handleTCPEvents(messageJson) + print(f"Received message from {client_address}: {message}") + + except socket.error as e: + if e.errno == 10054: + print(f"Connection with {client_address} forcibly closed by remote host.") + break + print(f"Socket error receiving data from {client_address}: {e}") + except json.JSONDecodeError as e: + print(f"JSON decoding error receiving data from {client_address}: {e}") + except Exception as e: + print(f"Error receiving data from {client_address}: {e}") def broadcast(self, payload:dict): - for user_address in self.__users.values(): - self.__tcpSocket.sendto(json.dumps(payload).encode(), user_address) + for user_socket in self.__users.values(): + user_socket.send(json.dumps(payload).encode()) def send(self, payload:dict, user:str): if user in self.__users: - self.__tcpSocket.sendto(json.dumps(payload).encode(), self.__users[user]) + self.__users[user].send(json.dumps(payload).encode()) tcp: TCP udp: UDP diff --git a/Game Server/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc b/Game Server/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc new file mode 100644 index 0000000..783943a Binary files /dev/null and b/Game Server/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc differ diff --git a/Game Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc b/Game Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc new file mode 100644 index 0000000..ef6db75 Binary files /dev/null and b/Game Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc differ diff --git a/Game Server/Classes/System/__pycache__/Server.cpython-311.pyc b/Game Server/Classes/System/__pycache__/Server.cpython-311.pyc new file mode 100644 index 0000000..14462d2 Binary files /dev/null and b/Game Server/Classes/System/__pycache__/Server.cpython-311.pyc differ diff --git a/Game Server/index.py b/Game Server/index.py index db425cc..18c5a2a 100644 --- a/Game Server/index.py +++ b/Game Server/index.py @@ -1,15 +1,12 @@ import os -import dotenv from Classes.System.Server import Server -def main(self): - dotenv.load_dotenv() - +def main(): # retrieves host data from environment - HOST = os.getenv("HOST") - TCPPORT = os.getenv("TCPPORT") - UDPPORT = os.getenv("UDPPORT") + HOST = "127.0.0.1" + TCPPORT = "54322" + UDPPORT = "54323" Server(HOST, TCPPORT, UDPPORT)