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)