Files
tcp_port_tran/target_client.py
2024-10-09 19:31:59 +08:00

191 lines
4.9 KiB
Python

import os
import sys
import json
import socket
import threading
import time
import prot_codec as pc
from log import myprint
from log import log_init
# tcp 客户端脚本
# 一个本地服务端
# 一个远程客户端
_LOCAL_PORT = 31234
_remote_client=None
_local_client=[]
_local_server=None
_local_client_lock = threading.Lock()
# 发送数据到指定ip地址和端口
def send_to(ip,port,data:bytearray):
for item in _local_client:
if(item[1]==ip and item[2]==port):
item[0].send(data)
return
myprint(f"can not fond {ip}:{port}")
# 关闭指定地址的端口
def close(ip,port):
global _local_client
global _local_client_lock
_local_client_lock.acquire()
for item in _local_client:
if(item[1]==ip and item[2]==port):
myprint(f'断开连接 {ip}:{port}')
item[0].close()
_local_client.remove(item)
break
_local_client_lock.release()
# 关闭所有
def close_all():
global _local_client
global _local_client_lock
_local_client_lock.acquire()
for item in _local_client:
item[0].close()
_local_client=[]
_local_client_lock.release()
myprint('连接列表已清空')
# 远端数据处理,解包,把负载数据发送到本地服务器
# 这个线程只会创建一个,用于连接代理服务器
def remote_client_handler(tcp_remote:socket):
global _remote_client
global _local_client
global _local_server
myprint("已连接代理服务器")
recv_data=bytearray()
cmd={'device':'client','option':'login'}
data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default')
_remote_client.send(data)
while True:
try:
recv = tcp_remote.recv(4096)
except Exception as e:
myprint("代理服务器连接异常",str(e))
break
if recv:
recv_data+=recv
while True:
start=recv_data.find(b'\xff')
end=recv_data.find(b'\xfe')
if(start==-1 or end==-1):
break
cmd,data=pc.decode(recv_data[start:end+1])
myprint(cmd.decode('utf-8'))
try:
j=json.loads(cmd)
if(j['device']=='server'):
if(j['option']=='data'):
myprint(f"收到数据 {j['ip']}:{j['port']}")
send_to(j['ip'],j['port'],data)
elif(j['option']=='disconnect'):
myprint(f"收到服务器的断开通知 {j['ip']}:{j['port']}")
close(j['ip'],j['port'])
elif(j['device']=='proxy'):
if(j['option']=='close'):
myprint("收到代理服务器的断开通知")
close_all()
except Exception as e:
myprint(str(e))
recv_data=recv_data[end+1:]
else:
break
tcp_remote.close()
myprint("代理服务器已断开")
close_all()
if _local_server is not None:
_local_server.close()
# 本地数据处理,解包,把负载数据发送到本地服务器
# 每个本地连接都会创建一个线程
def local_client_handler(tcp_server:socket,addr):
global _remote_client
global _local_client
myprint("addr:",addr)
addr_info=(tcp_server,addr[0],addr[1])
_local_client.append(addr_info)
if(_remote_client is not None):
cmd={'device':'client','option':'connect','ip':addr[0],'port':addr[1]}
data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default')
_remote_client.send(data)
while True:
try:
recv = tcp_server.recv(4096)
except Exception as e:
myprint("local:",str(e))
break
if recv:
cmd={'device':'client','option':'data','ip':addr[0],'port':addr[1]}
data=pc.encode(json.dumps(cmd).encode('utf-8'),recv)
if _remote_client is not None:
_remote_client.send(data)
myprint(f"发送数据 {addr[0]}:{addr[1]}")
else:
break
close(addr[0],addr[1])
cmd={'device':'client','option':'disconnect','ip':addr[0],'port':addr[1]}
data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default')
if(_remote_client is not None):
try:
myprint(f"发送断开通知到服务器端 {addr[0]}:{addr[1]}")
_remote_client.send(data)
except Exception as e:
myprint("远端连接异常",str(e))
def main():
global _remote_client
global _local_client
global _local_server
_remote_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
_remote_client.connect(("1.92.113.30",5345))
thd = threading.Thread(target = remote_client_handler, args = (_remote_client,))
thd.start()
_local_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
_local_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
_local_server.bind(("",_LOCAL_PORT))
myprint(f"开始监听({_LOCAL_PORT})")
_local_server.listen(128)
while True:
try:
temp , temp_address = _local_server.accept()
except Exception as e:
myprint("local server:",str(e))
break
thd = threading.Thread(target = local_client_handler, args = (temp,temp_address))
thd.start()
if __name__ == "__main__":
log_init("target_client.log")
main()