admin
2023-07-21 f51466f1d4563f97b1ec620b70a1c94f01a6a2e1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import json
import socket
 
import constant
import socket_util
 
 
class SendResponseSkManager:
    __send_response_sk_dict = {}
 
    @classmethod
    def get_send_response_sk(cls, type):
        if type not in cls.__send_response_sk_dict:
            client = cls.create_send_response_sk(type)
            cls.__send_response_sk_dict[type] = client
        return cls.__send_response_sk_dict[type]
 
    @classmethod
    def del_send_response_sk(cls, type):
        if type in cls.__send_response_sk_dict:
            try:
                cls.__send_response_sk_dict[type].close()
            except:
                pass
            cls.__send_response_sk_dict.pop(type)
 
    @classmethod
    def create_send_response_sk(cls, type):
        addr, port = constant.SERVER_IP, constant.SERVER_PORT
        client = socket.socket()  # 生成socket,连接server
        client.connect((addr, port))
        return client
 
    @classmethod
    def send_error_response(cls, type, request_id, client_id, msg):
        cls.send_normal_response(type, cls.load_response(client_id, request_id, {"code": 1, "msg": msg}))
 
    @classmethod
    def __send_normal_response(cls, sk, msg):
        # 添加内容长度头
        msg = cls.format_response(msg)
        sk.send(msg)
        result, header_str = socket_util.recv_data(sk)
        # print("响应", result)
        if result:
            result_json = json.loads(result)
            if result_json.get("code") == 0:
                return True
        return False
 
    # 发送消息
    @classmethod
    def send_normal_response(cls, type, msg):
        try:
            sk = SendResponseSkManager.get_send_response_sk(type)
            if cls.__send_normal_response(sk, msg):
                return True
            else:
                # 再次发送
                sk = SendResponseSkManager.get_send_response_sk(type)
                return cls.__send_normal_response(sk, msg)
        except ConnectionResetError as e:
            SendResponseSkManager.del_send_response_sk(type)
            sk = SendResponseSkManager.get_send_response_sk(type)
            return cls.__send_normal_response(sk, msg)
        except BrokenPipeError as e:
            SendResponseSkManager.del_send_response_sk(type)
            sk = SendResponseSkManager.get_send_response_sk(type)
            return cls.__send_normal_response(sk, msg)
 
    @classmethod
    def load_response(cls, client_id, request_id, data_json):
        return json.dumps({"type": "response", "data": data_json, "client_id": client_id,
                           "request_id": request_id}).encode(
            'utf-8')
 
    @classmethod
    def format_response(cls, data_bytes):
        slen = '##%08d' % len(data_bytes)
        return slen.encode("utf-8") + data_bytes