整理业务逻辑,添加一些注释
This commit is contained in:
31
server.py
31
server.py
@@ -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()
|
||||||
|
10
target.py
10
target.py
@@ -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')
|
||||||
|
@@ -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)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user