You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提升基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:02:08