如何使用Python实现局域网内的文件快速传输_基于HTTP.server模块

老静大大_5239

老静大大_5239

2026-05-01

267人浏览

原创

直接用python -m http.server传大文件会卡顿或失败,因其默认单线程、不支持Range请求、无超时控制和断点续传,导致浏览器分片请求被忽略或返回404,连接中断或速度骤降。

如何使用python实现局域网内的文件快速传输_基于http.server模块

为什么直接用 python -m http.server 传文件会卡顿或失败

局域网传大文件(比如 >100MB)时,http.server 默认行为容易触发浏览器下载中断、连接重置或传输速度骤降。根本原因不是协议问题,而是它默认不设超时、不处理并发请求、也不支持断点续传——浏览器发起多个 Range 请求时,服务端直接忽略或返回 404,客户端就卡住。

  • Windows 资源管理器或 macOS Finder 通过 SMB 挂载访问更稳,但 http.server 是纯 HTTP,没这些底层优化
  • Python 3.7+ 的 http.server 默认使用单线程,同一时间只能处理一个请求;手机浏览器预加载、多标签访问会排队甚至超时
  • 不设置 Content-Length 或错误设置 Content-Range,会导致 Chrome/Firefox 拒绝接受分片响应

如何让 http.server 支持稳定的大文件下载

核心是绕过默认的 SimpleHTTPRequestHandler,自定义一个能正确响应 Range 请求、设置必要头字段、并启用线程池的版本。不需要额外依赖,纯标准库可实现。

  • 继承 http.server.SimpleHTTPRequestHandler,重写 do_GET 方法,在读取文件前检查 Range 请求头
  • 必须手动计算并返回 Content-Range 和 Content-Length,且状态码要设为 206 Partial Content
  • 用 socketserver.ThreadingTCPServer 替代默认单线程启动方式,避免请求阻塞
  • 禁用日志输出(重写 log_message 为空)可减少 I/O 开销,尤其在千兆局域网中明显提升吞吐
import socketserver
import http.server
import os
<p>class RangeRequestHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
self.path = '/index.html'
f = self.send_head()
if f:
try:
self.copyfile(f, self.wfile)
finally:
f.close()</p><pre class="brush:php;toolbar:false;">def send_head(self):
    path = self.translate_path(self.path)
    if os.path.isdir(path):
        return super().send_head()
    if not os.path.exists(path):
        self.send_error(404, "File not found")
        return None
    try:
        f = open(path, 'rb')
    except OSError:
        self.send_error(403, "Forbidden")
        return None
    fs = os.fstat(f.fileno())
    size = fs.st_size
    start, end = 0, size - 1
    range_header = self.headers.get('Range')
    if range_header:
        # 解析 Range: bytes=100-199
        rstart, rend = range_header.strip().replace('bytes=', '').split('-')
        start = int(rstart) if rstart else 0
        end = int(rend) if rend else size - 1
        self.send_response(206)
        self.send_header('Content-Range', f'bytes {start}-{end}/{size}')
    else:
        self.send_response(200)
    self.send_header('Content-Type', self.guess_type(path))
    self.send_header('Content-Length', str(end - start + 1))
    self.send_header('Accept-Ranges', 'bytes')
    self.end_headers()
    f.seek(start)
    return f

if name == 'main': with socketserver.ThreadingTCPServer(('', 8000), RangeRequestHandler) as httpd: print("Serving at https://www.php.cn/link/fcbb3a1c04ec11f1506563c26ca63774") httpd.serve_forever()

实际使用时哪些路径和参数最容易出错

启动脚本后,本地浏览器能打开,但手机或另一台电脑访问不到,90% 是网络配置或路径权限问题,不是代码本身。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 绑定地址写成 localhost 或 127.0.0.1 → 必须用空字符串 '' 或 0.0.0.0 才监听所有网卡
  • 防火墙拦截:Windows Defender / macOS 防火墙默认阻止非签名 Python 进程监听外部连接,需手动放行端口 8000(TCP)
  • 共享目录含中文或空格:Python 3.7+ 对 URL 解码基本可靠,但若用 urllib.parse.unquote 手动处理路径,注意 %20 和 + 差异;建议启动前先 os.chdir() 到目标目录,避免路径拼接出错
  • 手机访问显示 404:确认手机和电脑在同一子网(如都是 192.168.1.x),并在手机浏览器输完整 IP,例如 http://192.168.1.105:8000/file.zip,不要输 localhost

比 http.server 更快的替代方案有哪些

如果只是临时传几个文件,http.server 加上上述改造已够用;但真要追求速度和稳定性,有三个轻量级替代方向值得留意:

  • python -m http.server --bind 0.0.0.0:8000 --directory ./share(Python 3.7+)→ 省去写脚本,但不支持 Range,仅适合小文件
  • 用 aria2c --enable-rpc --rpc-listen-all 搭配 Web UI,支持多线程下载、断点续传,但需额外安装
  • 零配置方案:pip install pyserv 后运行 pyserv --port 8000 --range,内部封装了线程+Range+跨域头,比手写更省心

真正影响体验的从来不是协议层,而是你有没有关掉 Windows 的“网络发现”自动限速、有没有把共享目录放在 SSD 上、以及手机 WiFi 是否启用了节电模式强制休眠链路——这些细节比选哪个模块更重要。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1811

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4844

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1769

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

28877

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3447

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3467

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2683

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习