diff --git a/server.py b/server.py index ae69aa2..4579c08 100644 --- a/server.py +++ b/server.py @@ -3,6 +3,7 @@ import threading import os import sys import json +import time import prot_codec as pc @@ -10,22 +11,39 @@ import target as tg -# 服务器端脚本,用于转发端口数据 +# 代理服务器端脚本,用于转发端口数据 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): - print(f"客户端:{tcp_addr} 已连接") + myprint(f"客户端:{tcp_addr} 已连接") recv_data=bytearray() target =tg.tcp_target(tcp_client_1) while True: try: recv = tcp_client_1.recv(4096) except Exception as e: - print(str(e)) + myprint(str(e)) break if recv: recv_data+=recv @@ -38,9 +56,9 @@ def dispose_client_request(tcp_client_1,tcp_addr): recv_data=recv_data[end+1:] else: break - print(f"客户端:{tcp_addr} 已下线") - tcp_client_1.close() + myprint(f"客户端:{tcp_addr} 已下线") 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.bind(("",SERVER_PORT)) - print(f"开始监听 ({SERVER_PORT})") + myprint(f"开始监听 ({SERVER_PORT})") tcp_server.listen(128) while True: @@ -61,4 +79,5 @@ def start_service(): if __name__ == "__main__": + _log_fp=open("tcp_tran_server.log",mode="w+",encoding="utf-8") start_service() diff --git a/target.py b/target.py index 0fc8f9d..e2814e2 100644 --- a/target.py +++ b/target.py @@ -24,6 +24,8 @@ import prot_codec as pc # close +# 这里是公共变量,所有tcp_target对象都可以访问 +# 只支持一对一连接 _tcp_server=None _tcp_client=None @@ -36,26 +38,32 @@ class tcp_target(object): 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') diff --git a/target_server.py b/target_server.py index f6c57bb..afa1180 100644 --- a/target_server.py +++ b/target_server.py @@ -20,7 +20,9 @@ import prot_codec as pc # 另一个连接本地tcp服务器 +# 保存连接代理服务器的端口 _remote_client=None +# 保存本地连接的tcp客户端端口列表 _local_client=[] @@ -44,17 +46,22 @@ def close(ip,port): if(item[1]==ip and item[2]==port): print(f"remote close:{ip},{port}") item[0].close() + # 删除已被关闭的条目 + _local_client.remove(item) break # 关闭所有 def close_all(): for item in _local_client: item[0].close() + # 关闭端口之后把列表置空 + _local_client=[] print('remote close all') # 本地数据处理,解包,把负载数据发送到本地服务器 +# 每一个connect都会创建一个线程 def local_client_handler(tcp_server:socket,ip,port): global _remote_client global _local_client @@ -76,11 +83,12 @@ def local_client_handler(tcp_server:socket,ip,port): else: break tcp_server.close() + _local_client.remove(self_info) + # 发送连接断开的消息 cmd={'device':'server','option':'disconnect','ip':ip,'port':port} data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default') if _remote_client is not None: _remote_client.send(data) - _local_client.remove(self_info)