整理业务逻辑,添加一些注释

This commit is contained in:
ranchuan
2024-10-08 19:27:36 +08:00
parent 554191bc00
commit f18fdb9636
3 changed files with 43 additions and 8 deletions

View File

@@ -3,6 +3,7 @@ import threading
import os import os
import sys import sys
import json import json
import time
import prot_codec as pc import prot_codec as pc
@@ -10,22 +11,39 @@ import target as tg
# 服务器端脚本,用于转发端口数据 # 代理服务器端脚本,用于转发端口数据
SERVER_PORT = 5345 SERVER_PORT = 5345
_log_fp=None
def _time():
return '['+time.strftime("%Y-%m-%d %H:%M:%S")+']'
def myprint_dec(func):
def wrapper(*args, **kwargs):
# 在这里添加额外的功能
# print(_time(), str(e),file=_log_fp)
kwargs["file"]=_log_fp
result = func(_time(),*args, **kwargs)
_log_fp.flush()
return result
return wrapper
myprint=myprint_dec(print)
# 定义个函数,使其专门重复处理客户的请求数据(也就是重复接受一个用户的消息并且重复回答,直到用户选择下线) # 定义个函数,使其专门重复处理客户的请求数据(也就是重复接受一个用户的消息并且重复回答,直到用户选择下线)
def dispose_client_request(tcp_client_1,tcp_addr): def dispose_client_request(tcp_client_1,tcp_addr):
print(f"客户端:{tcp_addr} 已连接") myprint(f"客户端:{tcp_addr} 已连接")
recv_data=bytearray() recv_data=bytearray()
target =tg.tcp_target(tcp_client_1) target =tg.tcp_target(tcp_client_1)
while True: while True:
try: try:
recv = tcp_client_1.recv(4096) recv = tcp_client_1.recv(4096)
except Exception as e: except Exception as e:
print(str(e)) myprint(str(e))
break break
if recv: if recv:
recv_data+=recv recv_data+=recv
@@ -38,9 +56,9 @@ def dispose_client_request(tcp_client_1,tcp_addr):
recv_data=recv_data[end+1:] recv_data=recv_data[end+1:]
else: else:
break break
print(f"客户端:{tcp_addr} 已下线") myprint(f"客户端:{tcp_addr} 已下线")
tcp_client_1.close()
target.close() target.close()
tcp_client_1.close()
@@ -49,7 +67,7 @@ def start_service():
tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
tcp_server.bind(("",SERVER_PORT)) tcp_server.bind(("",SERVER_PORT))
print(f"开始监听 ({SERVER_PORT})") myprint(f"开始监听 ({SERVER_PORT})")
tcp_server.listen(128) tcp_server.listen(128)
while True: while True:
@@ -61,4 +79,5 @@ def start_service():
if __name__ == "__main__": if __name__ == "__main__":
_log_fp=open("tcp_tran_server.log",mode="w+",encoding="utf-8")
start_service() start_service()

View File

@@ -24,6 +24,8 @@ import prot_codec as pc
# close # close
# 这里是公共变量所有tcp_target对象都可以访问
# 只支持一对一连接
_tcp_server=None _tcp_server=None
_tcp_client=None _tcp_client=None
@@ -36,26 +38,32 @@ class tcp_target(object):
def recv_handler(self,recv_data:bytearray): def recv_handler(self,recv_data:bytearray):
global _tcp_client global _tcp_client
global _tcp_server global _tcp_server
# 解包查看数据类型
cmd,data=pc.decode(recv_data) cmd,data=pc.decode(recv_data)
print(cmd.decode('utf-8')) print(cmd.decode('utf-8'))
j=json.loads(cmd) j=json.loads(cmd)
if(j["device"]=="client"): if(j["device"]=="client"):
if(j["option"]=="login"): if(j["option"]=="login"):
# 登陆时保存客户端句柄,断开之前的句柄
if(_tcp_client is not None): if(_tcp_client is not None):
_tcp_client.close() _tcp_client.close()
_tcp_client=self.handler _tcp_client=self.handler
else: else:
# 其他消息原样发送到服务器端
if(_tcp_server is not None): if(_tcp_server is not None):
_tcp_server.send(recv_data) _tcp_server.send(recv_data)
if(j["device"]=="server"): if(j["device"]=="server"):
if(j["option"]=="login"): if(j["option"]=="login"):
# 登陆时保存客户端句柄,断开之前的句柄
if(_tcp_server is not None): if(_tcp_server is not None):
_tcp_server.close() _tcp_server.close()
_tcp_server=self.handler _tcp_server=self.handler
else: else:
# 其他消息原样发送到客户端
if(_tcp_client is not None): if(_tcp_client is not None):
_tcp_client.send(recv_data) _tcp_client.send(recv_data)
# 只要有一个断了所有的都断开 # 通知服务器和客户端断开连接
# 这里只进行数据的收发处理不执行端口的close操作
def close(self): def close(self):
cmd={'device':'proxy','option':'close'} cmd={'device':'proxy','option':'close'}
data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default') data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default')

View File

@@ -20,7 +20,9 @@ import prot_codec as pc
# 另一个连接本地tcp服务器 # 另一个连接本地tcp服务器
# 保存连接代理服务器的端口
_remote_client=None _remote_client=None
# 保存本地连接的tcp客户端端口列表
_local_client=[] _local_client=[]
@@ -44,17 +46,22 @@ def close(ip,port):
if(item[1]==ip and item[2]==port): if(item[1]==ip and item[2]==port):
print(f"remote close:{ip},{port}") print(f"remote close:{ip},{port}")
item[0].close() item[0].close()
# 删除已被关闭的条目
_local_client.remove(item)
break break
# 关闭所有 # 关闭所有
def close_all(): def close_all():
for item in _local_client: for item in _local_client:
item[0].close() item[0].close()
# 关闭端口之后把列表置空
_local_client=[]
print('remote close all') print('remote close all')
# 本地数据处理,解包,把负载数据发送到本地服务器 # 本地数据处理,解包,把负载数据发送到本地服务器
# 每一个connect都会创建一个线程
def local_client_handler(tcp_server:socket,ip,port): def local_client_handler(tcp_server:socket,ip,port):
global _remote_client global _remote_client
global _local_client global _local_client
@@ -76,11 +83,12 @@ def local_client_handler(tcp_server:socket,ip,port):
else: else:
break break
tcp_server.close() tcp_server.close()
_local_client.remove(self_info)
# 发送连接断开的消息
cmd={'device':'server','option':'disconnect','ip':ip,'port':port} cmd={'device':'server','option':'disconnect','ip':ip,'port':port}
data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default') data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default')
if _remote_client is not None: if _remote_client is not None:
_remote_client.send(data) _remote_client.send(data)
_local_client.remove(self_info)