如何提升基于Socket的Python文件传输速度?
提升Python Socket文件传输速度的优化方案
你的文件传输速度慢主要是因为缓冲区过小、内存堆积、TCP算法延迟以及低效的结束判断逻辑导致的,以下是具体优化措施和修改后的代码:
核心优化点
- 增大缓冲区大小:改用更大的缓冲区(如64KB)减少系统调用次数,降低IO开销
- 流式读写:边接收/发送边写入文件,避免将整个文件加载到内存中
- 关闭Nagle算法:禁用
TCP_NODELAY减少小数据包的传输延迟 - 基于文件大小的精确传输:利用已知的文件大小控制接收流程,去掉冗余的结束标记
修改后的服务器代码
import socket import os # 设置64KB缓冲区,平衡内存占用与传输效率 BUFFER_SIZE = 65536 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 关闭Nagle算法,减少小数据包延迟 server.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) server.bind(('localhost', 9999)) server.listen() client, addr = server.accept() # 接收文件名 file_name = client.recv(BUFFER_SIZE).decode().strip() file_path = f"Server_files/{file_name}" # 处理文件不存在的情况 if not os.path.exists(file_path): client.send(b"ERROR: File not found") client.close() server.close() exit() file_size = os.path.getsize(file_path) # 发送文件大小 client.send(f"{file_size}".encode()) # 分块读取并发送文件,避免一次性加载大文件到内存 with open(file_path, "rb") as f: while True: data = f.read(BUFFER_SIZE) if not data: break client.sendall(data) client.close() server.close()
修改后的客户端代码
import tqdm import socket BUFFER_SIZE = 65536 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) client.connect(('localhost', 9999)) file_name = input("Enter the file name: ").strip() client.send(file_name.encode()) # 接收文件大小并处理错误 file_size_data = client.recv(BUFFER_SIZE).decode() if file_size_data.startswith("ERROR"): print(file_size_data) client.close() exit() file_size = int(file_size_data) received_bytes = 0 progress = tqdm.tqdm(unit="B", unit_scale=True, unit_divisor=1000, total=file_size) # 分块接收并写入文件,避免内存堆积 with open(file_name, "wb") as f: while received_bytes < file_size: # 计算剩余需要接收的字节数,避免最后一次接收多余数据 remaining = file_size - received_bytes chunk_size = min(BUFFER_SIZE, remaining) data = client.recv(chunk_size) if not data: break f.write(data) received_bytes += len(data) progress.update(len(data)) progress.close() client.close()
额外优化建议
- 跨网络传输时可使用zlib等压缩算法先压缩文件,减少传输数据量
- 超大文件场景可加入断点续传逻辑,避免传输中断后重新开始
- 高并发场景可结合多线程/多进程处理,但单线程优化后已能满足大部分常规需求
内容的提问来源于stack exchange,提问作者Uvindu Dassanayaka
相关产品推荐
相关产品推荐

