Значит, для загрузки одного файла будет много потоков, имеет ли это какой-то смысл? со стороны сети мне кажется, что этот способ передачи файлов не тот, но это запрос проекта моей школы.
пока у меня есть 2 функции отправки и получения, которые используют только один поток для передачи данных файла с 8-байтовым префиксом для указания размера.
Код: Выделить всё
import struct
import os
import socket
MAX_BUF = 65536
def send_file(sock, file_path):
"""Send file size and data"""
file_size = struct.pack(">Q", os.stat(file_path).st_size)
sock.sendall(file_size)
with open(file_path, "rb") as f:
sock.sendfile(f)
def recv_file(sock, file_path):
"""Receive file size and write to path"""
raw_file_size = recv_all(sock, 8)
file_size = struct.unpack(">Q", raw_file_size)[0]
total_written = 0
buffer = bytearray(MAX_BUF)
view = memoryview(buffer)
with open(file_path, "wb") as f:
while total_written < file_size:
read_size = min(file_size - total_written, MAX_BUF)
received = sock.recv_into(view[:read_size])
if not received:
raise OSError("Other side abruptly disconnected.")
total_written += received
f.write(view[:received])
def recv_all(sock, n):
"""Helper function to recv n bytes or return except if EOF is hit"""
data = bytearray(n)
view = memoryview(data)
total_received = 0
while total_received < n:
received = sock.recv_into(
view[total_received:], min(n - total_received, MAX_BUF)
)
if not received:
raise OSError("Other side abruptly disconnected.")
total_received += received
return data
Подробнее здесь: https://stackoverflow.com/questions/786 ... ing-thread