# -*- coding: utf-8 -*-
|
import json
|
import socket
|
|
from huaxin_client import socket_util, constant
|
|
SERVER_IP = "127.0.0.1"
|
SERVER_PORT = 10008
|
|
|
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=SERVER_IP, port=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
|