110 lines
4.3 KiB
Python
110 lines
4.3 KiB
Python
import socket
|
|
import threading
|
|
import time
|
|
import traceback
|
|
from queue import Queue
|
|
|
|
from LSZXNetWork.consensus import *
|
|
from LSZXNetWork.transmission import Server
|
|
from LogRecord.log_recorder import GLOBAL_LOG
|
|
|
|
from LSZXBackend.general import *
|
|
|
|
|
|
class Transit_Client:
|
|
|
|
def __init__(self, ip, timeout=20) -> None:
|
|
super().__init__()
|
|
self.timeout = timeout
|
|
self.ip = ip
|
|
self.transit_ip = None
|
|
self.transit_port = None
|
|
|
|
def connect_transit(self, ip, port):
|
|
self.transit_ip = ip
|
|
self.transit_port = port
|
|
|
|
def transit_file(self, file_path, file_name, final_target_ip):
|
|
try:
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
sock.settimeout(self.timeout)
|
|
sock.bind((self.ip, 0))
|
|
|
|
status_code = sock.connect_ex((self.transit_ip, self.transit_port))
|
|
if status_code == 0:
|
|
with open(file_path, "rb") as file:
|
|
data = final_target_ip.encode("gb2312") + b"\x00" + file_name.encode("gb2312") + b"\x00"
|
|
# 增加一步封装,以区分内容为数据还是文件
|
|
while data:
|
|
sock.send(data)
|
|
data = file.read(SEND_BUFFER_SIZE)
|
|
else:
|
|
return False
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(e.args)
|
|
print(traceback.format_exc())
|
|
return False
|
|
|
|
|
|
class Transit_Server:
|
|
|
|
def __init__(self, ip, transit_port=0) -> None:
|
|
super().__init__()
|
|
# 文件保存路径
|
|
self._running_signal = threading.Event()
|
|
self._running_signal.set()
|
|
if transit_port > 0:
|
|
self.transit_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
self.transit_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
self.transit_sock.bind((ip, transit_port))
|
|
self.transit_sock.listen(128)
|
|
threading.Thread(target=self.transit_file_recv, daemon=True).start()
|
|
else:
|
|
self.transit_sock = None
|
|
# 数据接收缓存
|
|
self.queue = Queue()
|
|
# transmission转发
|
|
self.client = Transit_Client(ip="0.0.0.0")
|
|
|
|
def transit_file_recv(self):
|
|
while self._running_signal.is_set():
|
|
try:
|
|
conn, connected_addr = self.transit_sock.accept()
|
|
conn: socket.socket
|
|
conn.settimeout(0.5)
|
|
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
sock.settimeout(0.5)
|
|
sock.bind(('0.0.0.0', 0))
|
|
|
|
_ip, data = conn.recv(RECV_BUFFER_SIZE).split(b"\x00", 1)
|
|
_ip = _ip.decode("gb2312")
|
|
status_code = sock.connect_ex((_ip, server_file_port))
|
|
while status_code == 0:
|
|
try:
|
|
sock.send(data)
|
|
data = conn.recv(RECV_BUFFER_SIZE)
|
|
if not data:
|
|
break
|
|
except Exception as e:
|
|
print(traceback.format_exc())
|
|
conn.close()
|
|
except Exception as ce:
|
|
GLOBAL_LOG.write(f"文件传输连接时发生错误{ce.args}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
server = Server(ip='0.0.0.0', port=0, file_port=server_file_port, cache_path='./')
|
|
Transit_Server = Transit_Server(ip="127.0.0.1", transit_port=13132)
|
|
Transit_Client = Transit_Client(ip="127.0.0.1")
|
|
|
|
Transit_Client.connect_transit(ip="127.0.0.1", port=13132)
|
|
Transit_Client.transit_file(file_path='D:\\Desktop\\7_人员7_蛇形跑_0_2024-06-05-20-15-09.mp4', file_name='7_人员7_蛇形跑_0_2024-06-05-20-15-09.mp4', final_target_ip='127.0.0.1')
|
|
# Transit_Client.connect_transit(ip="127.0.0.1", port=13132)
|
|
# Transit_Client.transit_file(file_path='D:\\Desktop\\3_人员3_蛇形跑_55.0_2024-06-07-16-14-46.mp4', file_name='3_人员3_蛇形跑_55.0_2024-06-07-16-14-46.mp4', final_target_ip='127.0.0.1')
|
|
time.sleep(5)
|