must
/
com_tcp.py
97 строк · 3.2 Кб
1import sys2import socket3import threading4import com_base5
6
7class TCPServer(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_STREAM)13try:14self.sock.bind((app.config['socket_ip'], app.config['socket_port']))15except OSError:16raise RuntimeError('Failed to create socket')17# self.sock.setblocking(False)18self.clients = []19self.sock.listen()20self.running = True21threading.Thread(target=self.accept_clients).start()22
23def update(self) -> None:24pass25
26def accept_clients(self) -> None:27while self.running and self.sock:28try:29conn, addr = self.sock.accept()30except OSError:31break32self.clients.append(conn)33threading.Thread(target=self.client_thread, args=(conn, )).start()34
35def client_thread(self, conn: socket.socket) -> None:36should_exit = True37while self.running:38try:39msg_len_buf = conn.recv(10)40if not msg_len_buf:41continue42msg_len = int.from_bytes(msg_len_buf, 'little', signed=False)43encoded_msg = conn.recv(msg_len)44except OSError:45return46msg = self.decode_msg(encoded_msg)47if should_exit:48if msg == 'i_want_to_live_please_do\'nt_die':49should_exit = False50continue51self.commands.append(msg)52conn.close()53if conn in self.clients:54self.clients.remove(conn)55return56if msg == 'disconnect':57conn.close()58if conn in self.clients:59self.clients.remove(conn)60return61self.commands.append(msg)62# self.should_kill = False63
64def destroy(self) -> None:65for conn in self.clients:66conn.close()67self.clients.clear()68self.running = False69if self.sock:70self.sock.close()71self.sock = None72self.app = None73
74
75class TCPClient(com_base.BaseClient):76def __init__(self, app: any) -> None:77super().__init__(app)78self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)79try:80self.sock.connect((app.config['socket_ip'], app.config['socket_port']))81except Exception as _err:82raise RuntimeError(str(_err))83
84def send(self, msg: str) -> None:85if not msg:86return87encoded_msg = com_base.BaseServer.encode_msg(msg)88try:89self.sock.send(int.to_bytes(len(encoded_msg), 10, 'little', signed=False) + encoded_msg)90except Exception as _err:91raise RuntimeError(str(_err))92
93def destroy(self) -> None:94super().destroy()95if self.sock:96self.sock.close()97self.sock = None98