import os import sys import json import socket import prot_codec as pc from log import myprint from log import log_init # 定义服务器和客户端 # device: # server # client # proxy # 定义操作类型 # option: # connect # disconnect # data # login # close # 这里是公共变量,所有tcp_target对象都可以访问 # 只支持一对一连接 _tcp_server:socket.socket=None _tcp_client:socket.socket=None class tcp_target(object): def __init__(self,tcp_handler:socket.socket): self.handler=tcp_handler self.state="idle" def recv_handler(self,recv_data:bytearray): global _tcp_client global _tcp_server # 解包查看数据类型 cmd,data=pc.decode(recv_data) myprint(cmd.decode('utf-8')) j=json.loads(cmd) if(j["device"]=="client"): if(j["option"]=="login"): # 登陆时保存客户端句柄,断开之前的句柄 if(_tcp_client is not None): _tcp_client.close() _tcp_client=self.handler else: # 其他消息原样发送到服务器端 if(_tcp_server is not None): _tcp_server.send(recv_data) if(j["device"]=="server"): if(j["option"]=="login"): # 登陆时保存客户端句柄,断开之前的句柄 if(_tcp_server is not None): _tcp_server.close() _tcp_server=self.handler elif(j["option"]=="keeplive"): # 回复心跳数据 cmd={'device':'proxy','option':'keeplive'} data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default') if(_tcp_server is not None): _tcp_server.send(data) else: # 其他消息原样发送到客户端 if(_tcp_client is not None): _tcp_client.send(recv_data) # 通知服务器和客户端断开连接 def close(self): cmd={'device':'proxy','option':'close'} data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default') # 这里有可能连接已经断开,无法发送 if(_tcp_client is not None): try: _tcp_client.send(data) _tcp_client.close() except Exception as e: myprint("target_close:",str(e)) _tcp_client=None if(_tcp_server is not None): try: _tcp_server.send(data) _tcp_server.close() except Exception as e: myprint("target_close:",str(e)) _tcp_server=None