must

Форк
0
/
com_tcp.py 
97 строк · 3.2 Кб
1
import sys
2
import socket
3
import threading
4
import com_base
5

6

7
class TCPServer(com_base.BaseServer):
8
    def __init__(self, app: any) -> None:
9
        super().__init__()
10
        self.should_kill = not sys.platform == 'win32'
11
        self.app = app
12
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
13
        try:
14
            self.sock.bind((app.config['socket_ip'], app.config['socket_port']))
15
        except OSError:
16
            raise RuntimeError('Failed to create socket')
17
        # self.sock.setblocking(False)
18
        self.clients = []
19
        self.sock.listen()
20
        self.running = True
21
        threading.Thread(target=self.accept_clients).start()
22

23
    def update(self) -> None:
24
        pass
25

26
    def accept_clients(self) -> None:
27
        while self.running and self.sock:
28
            try:
29
                conn, addr = self.sock.accept()
30
            except OSError:
31
                break
32
            self.clients.append(conn)
33
            threading.Thread(target=self.client_thread, args=(conn, )).start()
34

35
    def client_thread(self, conn: socket.socket) -> None:
36
        should_exit = True
37
        while self.running:
38
            try:
39
                msg_len_buf = conn.recv(10)
40
                if not msg_len_buf:
41
                    continue
42
                msg_len = int.from_bytes(msg_len_buf, 'little', signed=False)
43
                encoded_msg = conn.recv(msg_len)
44
            except OSError:
45
                return
46
            msg = self.decode_msg(encoded_msg)
47
            if should_exit:
48
                if msg == 'i_want_to_live_please_do\'nt_die':
49
                    should_exit = False
50
                    continue
51
                self.commands.append(msg)
52
                conn.close()
53
                if conn in self.clients:
54
                    self.clients.remove(conn)
55
                return
56
            if msg == 'disconnect':
57
                conn.close()
58
                if conn in self.clients:
59
                    self.clients.remove(conn)
60
                return
61
            self.commands.append(msg)
62
        # self.should_kill = False
63

64
    def destroy(self) -> None:
65
        for conn in self.clients:
66
            conn.close()
67
        self.clients.clear()
68
        self.running = False
69
        if self.sock:
70
            self.sock.close()
71
            self.sock = None
72
        self.app = None
73

74

75
class TCPClient(com_base.BaseClient):
76
    def __init__(self, app: any) -> None:
77
        super().__init__(app)
78
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
79
        try:
80
            self.sock.connect((app.config['socket_ip'], app.config['socket_port']))
81
        except Exception as _err:
82
            raise RuntimeError(str(_err))
83

84
    def send(self, msg: str) -> None:
85
        if not msg:
86
            return
87
        encoded_msg = com_base.BaseServer.encode_msg(msg)
88
        try:
89
            self.sock.send(int.to_bytes(len(encoded_msg), 10, 'little', signed=False) + encoded_msg)
90
        except Exception as _err:
91
            raise RuntimeError(str(_err))
92

93
    def destroy(self) -> None:
94
        super().destroy()
95
        if self.sock:
96
            self.sock.close()
97
            self.sock = None
98

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.