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() 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: sk = cls.__send_response_sk_dict[type_] cls.__send_response_sk_dict.pop(type_) try: sk.close() except: pass @classmethod def create_send_response_sk(cls): 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