moved game management into own class serverside
This commit is contained in:
@ -1,4 +1,8 @@
|
||||
import socket
|
||||
from Classes.Game.Player import Player
|
||||
from Classes.System.GameManager import GameManager
|
||||
|
||||
from Classes.System.World import World
|
||||
|
||||
|
||||
class TCPEventHandler:
|
||||
@ -8,13 +12,13 @@ class TCPEventHandler:
|
||||
self.__tcpSocket = socket
|
||||
|
||||
# handles passing of event data to the right functions
|
||||
def handleTCPEvents(self, event):
|
||||
def handleTCPEvents(self, event, gameManager:GameManager, address):
|
||||
pass
|
||||
|
||||
class UDPEventHandler:
|
||||
__udpSocket:socket
|
||||
|
||||
def __init__(self, socket:socket):
|
||||
def __init__(self, socket:socket, gameManager:GameManager):
|
||||
self.__udpSocket = socket
|
||||
|
||||
def handleUDPEvents(self, event):
|
||||
|
@ -1,8 +1,11 @@
|
||||
import json
|
||||
import socket
|
||||
import threading
|
||||
from Classes.Game.Player import Player
|
||||
from Classes.System.GameManager import GameManager
|
||||
|
||||
from Classes.System.Network.EventHandler import UDPEventHandler, TCPEventHandler
|
||||
from Classes.System.World import World
|
||||
|
||||
class NetworkManager:
|
||||
|
||||
@ -11,24 +14,28 @@ class NetworkManager:
|
||||
__Port:str
|
||||
__BufferSize:int = 1024
|
||||
__udpSocket:socket
|
||||
__users:list
|
||||
__users:dict
|
||||
__eventHandler: UDPEventHandler
|
||||
__UDPClientThread:threading.Thread
|
||||
|
||||
def __init__(self, Addr:str, Port:str):
|
||||
__gameManager:GameManager
|
||||
|
||||
def __init__(self, Addr:str, Port:str, gameManager:GameManager):
|
||||
self.__Addr = Addr
|
||||
self.__Port = int(Port)
|
||||
|
||||
self.__gameManager = gameManager
|
||||
self.__users = {}
|
||||
self.__eventHandler = {}
|
||||
self.__udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
self.__udpSocket.bind((self.__Addr, self.__Port))
|
||||
|
||||
# Starten eines Threads für das Empfangen von UDP-Daten
|
||||
|
||||
try:
|
||||
self.__udpSocket.bind((self.__Addr, self.__Port))
|
||||
except OSError as e:
|
||||
print(f"Error binding UDP socket: {e}")
|
||||
|
||||
self.__UDPClientThread = threading.Thread(target=self.receive)
|
||||
self.__UDPClientThread.start()
|
||||
|
||||
# handles incomming udp data
|
||||
# handles incoming udp data
|
||||
def receive(self):
|
||||
while True:
|
||||
data, address = self.__udpSocket.recvfrom(self.__BufferSize)
|
||||
@ -40,7 +47,7 @@ class NetworkManager:
|
||||
self.__users[user] = address # Storing new user in dictionary
|
||||
|
||||
# Process the message and handle accordingly
|
||||
self.__eventHandler.handleUDPEvents(messageJson)
|
||||
self.__eventHandler.handleUDPEvents(messageJson, self.__serverWorld)
|
||||
print(f"Received message from {address}: {message}")
|
||||
|
||||
def broadcast(self, payload:dict):
|
||||
@ -56,15 +63,14 @@ class NetworkManager:
|
||||
__Port:str
|
||||
__BufferSize:int = 1024
|
||||
__tcpSocket:socket
|
||||
__users:list
|
||||
__eventHandler: TCPEventHandler
|
||||
__eventHandler: dict
|
||||
__TCPClientThread:threading.Thread
|
||||
__gameManager:GameManager
|
||||
|
||||
def __init__(self, Addr:str, Port:str):
|
||||
def __init__(self, Addr:str, Port:str, gameManager:GameManager):
|
||||
self.__Addr = Addr
|
||||
self.__Port = int(Port)
|
||||
|
||||
self.__users = {}
|
||||
self.__gameManager = gameManager
|
||||
self.__eventHandler = {}
|
||||
self.__tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.__tcpSocket.bind((self.__Addr, self.__Port))
|
||||
@ -95,16 +101,20 @@ class NetworkManager:
|
||||
data = client_socket.recv(self.__BufferSize)
|
||||
if not data:
|
||||
print(f"Connection with {client_address} closed.")
|
||||
break # Verbindung geschlossen, Schleife beenden
|
||||
break
|
||||
|
||||
message = data.decode()
|
||||
messageJson = json.loads(message)
|
||||
user = messageJson.get("user")
|
||||
|
||||
# creates a user and counts how many currently are connected to the server
|
||||
# if enough users for a round are connected the server has to start the game
|
||||
if user not in self.__users:
|
||||
self.__users[user] = client_address
|
||||
if messageJson["event"] == "login":
|
||||
self.__gameManager.addPlayers(Player(messageJson["username"]), self.__tcpSocket, client_address)
|
||||
print(f"connected users {len(self.__users)}")
|
||||
|
||||
self.__eventHandler[client_address].handleTCPEvents(messageJson)
|
||||
self.__eventHandler[client_address].handleTCPEvents(messageJson, self.__gameManager, client_address)
|
||||
print(f"Received message from {client_address}: {message}")
|
||||
|
||||
except socket.error as e:
|
||||
@ -118,16 +128,20 @@ class NetworkManager:
|
||||
print(f"Error receiving data from {client_address}: {e}")
|
||||
|
||||
def broadcast(self, payload:dict):
|
||||
for user_socket in self.__users.values():
|
||||
user_socket.send(json.dumps(payload).encode())
|
||||
for user in self.__gameManager.getPlayers().values():
|
||||
user["socket"].send(json.dumps(payload).encode())
|
||||
|
||||
def send(self, payload:dict, user:str):
|
||||
if user in self.__users:
|
||||
self.__users[user].send(json.dumps(payload).encode())
|
||||
def send(self, payload: dict, user: str):
|
||||
players = self.__gameManager.getPlayers()
|
||||
|
||||
if user in players and "socket" in players[user]:
|
||||
players[user]["socket"].send(json.dumps(payload).encode())
|
||||
else:
|
||||
print(f"user '{user}' or socket was not found 'socket' failed to send data.")
|
||||
|
||||
tcp: TCP
|
||||
udp: UDP
|
||||
|
||||
def __init__(self, Addr:str, TCPPort:str, UDPPort:str):
|
||||
self.tcp = self.TCP(Addr, TCPPort)
|
||||
self.udp = self.UDP(Addr, UDPPort)
|
||||
def __init__(self, Addr:str, TCPPort:str, UDPPort:str, gameManager:GameManager):
|
||||
self.tcp = self.TCP(Addr, TCPPort, gameManager)
|
||||
self.udp = self.UDP(Addr, UDPPort, gameManager)
|
||||
|
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user