must
/
com_udp.py
63 строки · 2.0 Кб
1import sys2import socket3import threading4import com_base5
6
7class UDPServer(com_base.BaseServer):8def __init__(self, app: any) -> None:9super().__init__()10self.should_kill = not sys.platform == 'win32'11self.app = app12self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)13try:14self.sock.bind((app.config['socket_ip'], app.config['socket_port']))15except OSError:16raise RuntimeError('Failed to create socket')17self.running = True18self.buf_size = 1024 * 1024 * 10019self.messages = {}20threading.Thread(target=self.client_thread).start()21
22def update(self) -> None:23pass24
25def client_thread(self) -> None:26# TODO: multiple clients at the same time27while self.running:28try:29encoded_msg, new_addr = self.sock.recvfrom(self.buf_size)30except OSError:31continue32msg = self.decode_msg(encoded_msg)33self.commands.append(msg)34# self.should_kill = False35
36def destroy(self) -> None:37self.running = False38if self.sock:39self.sock.close()40self.sock = None41self.app = None42
43
44class UDPClient(com_base.BaseClient):45def __init__(self, app: any) -> None:46super().__init__(app)47self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)48self.server_addr = (app.config['socket_ip'], app.config['socket_port'])49
50def send(self, msg: str) -> None:51if not msg or msg == 'i_want_to_live_please_do\'nt_die':52return53encoded_msg = com_base.BaseServer.encode_msg(msg)54try:55self.sock.sendto(encoded_msg, self.server_addr)56except Exception as _err:57raise RuntimeError(str(_err))58
59def destroy(self) -> None:60super().destroy()61if self.sock:62self.sock.close()63self.sock = None64