2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
import json
|
|
|
|
|
import socket
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import prot_codec as pc
|
2024-10-08 23:57:56 +08:00
|
|
|
|
from log import myprint
|
|
|
|
|
from log import log_init
|
2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 定义服务器和客户端
|
|
|
|
|
# device:
|
|
|
|
|
# server
|
|
|
|
|
# client
|
2024-05-23 11:14:17 +08:00
|
|
|
|
# proxy
|
2024-05-22 19:03:17 +08:00
|
|
|
|
# 定义操作类型
|
|
|
|
|
# option:
|
|
|
|
|
# connect
|
|
|
|
|
# disconnect
|
|
|
|
|
# data
|
|
|
|
|
# login
|
2024-05-23 11:14:17 +08:00
|
|
|
|
# close
|
2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|
2024-10-08 19:27:36 +08:00
|
|
|
|
# 这里是公共变量,所有tcp_target对象都可以访问
|
|
|
|
|
# 只支持一对一连接
|
2024-10-09 11:10:16 +08:00
|
|
|
|
_tcp_server:socket.socket=None
|
|
|
|
|
_tcp_client:socket.socket=None
|
2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class tcp_target(object):
|
2024-10-09 11:10:16 +08:00
|
|
|
|
def __init__(self,tcp_handler:socket.socket):
|
2024-05-22 19:03:17 +08:00
|
|
|
|
self.handler=tcp_handler
|
|
|
|
|
self.state="idle"
|
|
|
|
|
def recv_handler(self,recv_data:bytearray):
|
|
|
|
|
global _tcp_client
|
|
|
|
|
global _tcp_server
|
2024-10-08 19:27:36 +08:00
|
|
|
|
# 解包查看数据类型
|
2024-05-22 19:03:17 +08:00
|
|
|
|
cmd,data=pc.decode(recv_data)
|
2024-10-08 23:57:56 +08:00
|
|
|
|
myprint(cmd.decode('utf-8'))
|
2024-05-22 19:03:17 +08:00
|
|
|
|
j=json.loads(cmd)
|
|
|
|
|
if(j["device"]=="client"):
|
|
|
|
|
if(j["option"]=="login"):
|
2024-10-08 19:27:36 +08:00
|
|
|
|
# 登陆时保存客户端句柄,断开之前的句柄
|
2024-05-22 19:03:17 +08:00
|
|
|
|
if(_tcp_client is not None):
|
|
|
|
|
_tcp_client.close()
|
|
|
|
|
_tcp_client=self.handler
|
|
|
|
|
else:
|
2024-10-08 19:27:36 +08:00
|
|
|
|
# 其他消息原样发送到服务器端
|
2024-05-22 19:03:17 +08:00
|
|
|
|
if(_tcp_server is not None):
|
|
|
|
|
_tcp_server.send(recv_data)
|
|
|
|
|
if(j["device"]=="server"):
|
|
|
|
|
if(j["option"]=="login"):
|
2024-10-08 19:27:36 +08:00
|
|
|
|
# 登陆时保存客户端句柄,断开之前的句柄
|
2024-05-22 19:03:17 +08:00
|
|
|
|
if(_tcp_server is not None):
|
|
|
|
|
_tcp_server.close()
|
|
|
|
|
_tcp_server=self.handler
|
2024-10-09 11:10:16 +08:00
|
|
|
|
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)
|
2024-05-22 19:03:17 +08:00
|
|
|
|
else:
|
2024-10-08 19:27:36 +08:00
|
|
|
|
# 其他消息原样发送到客户端
|
2024-05-22 19:03:17 +08:00
|
|
|
|
if(_tcp_client is not None):
|
|
|
|
|
_tcp_client.send(recv_data)
|
2024-10-08 19:27:36 +08:00
|
|
|
|
# 通知服务器和客户端断开连接
|
2024-05-23 11:14:17 +08:00
|
|
|
|
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)
|
2024-10-09 11:10:16 +08:00
|
|
|
|
_tcp_client.close()
|
2024-05-23 11:14:17 +08:00
|
|
|
|
except Exception as e:
|
2024-10-08 23:57:56 +08:00
|
|
|
|
myprint("target_close:",str(e))
|
2024-10-09 11:10:16 +08:00
|
|
|
|
_tcp_client=None
|
2024-05-23 11:14:17 +08:00
|
|
|
|
if(_tcp_server is not None):
|
|
|
|
|
try:
|
|
|
|
|
_tcp_server.send(data)
|
2024-10-09 11:10:16 +08:00
|
|
|
|
_tcp_server.close()
|
2024-05-23 11:14:17 +08:00
|
|
|
|
except Exception as e:
|
2024-10-08 23:57:56 +08:00
|
|
|
|
myprint("target_close:",str(e))
|
2024-10-09 11:10:16 +08:00
|
|
|
|
_tcp_server=None
|
2024-05-23 11:14:17 +08:00
|
|
|
|
|
2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|