Files
tcp_port_tran/target.py

84 lines
1.9 KiB
Python
Raw Normal View History

import os
import sys
import json
import socket
import prot_codec as pc
# 定义服务器和客户端
# device:
# server
# client
# proxy
# 定义操作类型
# option:
# connect
# disconnect
# data
# login
# close
# 这里是公共变量所有tcp_target对象都可以访问
# 只支持一对一连接
_tcp_server=None
_tcp_client=None
class tcp_target(object):
def __init__(self,tcp_handler: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)
print(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
else:
# 其他消息原样发送到客户端
if(_tcp_client is not None):
_tcp_client.send(recv_data)
# 通知服务器和客户端断开连接
# 这里只进行数据的收发处理不执行端口的close操作
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)
except Exception as e:
print("target_close:",str(e))
if(_tcp_server is not None):
try:
_tcp_server.send(data)
except Exception as e:
print("target_close:",str(e))