LISHUZUOXUN_yangjiang/LSZXNetWork/data_transit.py

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)