项目地址:suyihang15/network_speed_test: 基于puython的网络测速软件
下载链接 https://github.com/suyihang15/network_speed_test/releases/download/1.0.0/network_speed_test.exe
🌐 网络测速工具
基于 Python 的可视化网络测速工具,支持下载速度、上传速度、网络延迟三项核心指标测试,提供实时速度曲线与历史记录。
功能特性
- 📥 下载测速 — 通过 Speedtest.net 多线程并发下载,精确测量带宽上限
- 📤 上传测速 — 多线程上传测试,真实反映上行带宽
- 📡 延迟测试 — 测量到最优服务器的往返时延 (RTT)
- 📈 实时曲线 — 测试过程中通过 psutil 监控网卡流量,实时绘制速度变化曲线
- 🎨 速度仪表盘 — 大字数字显示 + 彩色进度条,速度分级自动变色
- 📋 历史记录 — 自动保存最近 50 条测试结果,支持查看和清除
- 🌙 深色主题 — 现代暗色 UI,护眼且专业
界面布局
┌─────────────────────────────────────────────────────────┐ │ 📊 实时数据 │ 📈 实时速度曲线 │ │ │ │ │ 📥 下载速度 │ ┊ ╱╲ │ │ 85.6 Mbps │ ┊ ╱╲╱ ╲╲╲╲ 下载 (绿) │ │ ████████░░░░ 40% │ ┊ ╱ ╲── 上传 (蓝) │ │ │ ┊╱ ╲╲ │ │ 📤 上传速度 │ ─┼───────────────── │ │ 32.1 Mbps │ 0s 15s 30s │ │ ████░░░░░░░░ 16% │ │ │ ├─────────────────────────────────│ │ 📡 网络延迟 │ 📋 历史记录 │ │ 12 ms │ 时间 │下载 │上传 │延迟│ │ ████████████ 12% │ 2024-01-01 │85.6 │32.1 │12 │ │ │ ... │... │... │.. │ │ 服务器: China Telecom │ │ ├─────────────────────────────────────────────────────────┤ │ [🚀 开始测速] [🗑 清除历史] 状态: 就绪 │ └─────────────────────────────────────────────────────────┘
工作原理
测速流程
用户点击开始
│
▼
┌──────────────────┐
│ 1. 选择最优服务器 │ speedtest.get_best_server()
│ 测延迟,选最近 │ 根据地理位置和延迟自动选择
└──────┬───────────┘
│
▼
┌──────────────────┐
│ 2. 记录基线流量 │ psutil.net_io_counters()
│ 扣除背景噪声 │ 采样 0.5s, 计算背景带宽
└──────┬───────────┘
│
▼
┌──────────────────┐
│ 3. 延迟测试 (Ping) │ HTTP 往返时间测量
│ → 得到延迟 ms │ 取多次平均值
└──────┬───────────┘
│
▼
┌──────────────────┐
│ 4. 下载测试 │ 多线程 HTTP GET
│ 多连接并发下载 │ 持续 ~10 秒
│ → 得到下载速度 │ 采样网卡流量 → 实时曲线
└──────┬───────────┘
│
▼
┌──────────────────┐
│ 5. 上传测试 │ 多线程 HTTP POST
│ 多连接并发上传 │ 持续 ~10 秒
│ → 得到上传速度 │ 采样网卡流量 → 实时曲线
└──────┬───────────┘
│
▼
┌──────────────────┐
│ 6. 保存结果 │ JSON 持久化
│ 刷新仪表盘 │ 更新历史表格
└──────────────────┘
实时速度监控原理
本工具通过 psutil 库直接读取操作系统网卡计数器,在测速过程中每 200ms 采样一次流量数据:
速度 = (当前累计字节 - 上次累计字节) × 8 ÷ 时间间隔
─────────────────────────────────────────────────
实时 bps (bits per second)
为了避免后台应用(浏览器、系统更新等)的网络流量干扰测量结果,在测速开始前会先采集一段 基线流量:
实际速度 = 原始采样速度 - 基线速度
这种方式比单纯用 已传输字节 ÷ 总时间 能更细腻地反映速度波动,画出来的曲线也更真实。
技术栈
| 组件 | 库 | 作用 |
|---|---|---|
| GUI 框架 | tkinter | Python 内置,构建窗口和控件 |
| 测速引擎 | speedtest-cli | 连接 Speedtest.net 全球节点,多线程并发测速 |
| 实时监控 | psutil | 读取操作系统网卡 I/O 计数器 |
| 数据可视化 | matplotlib | 实时速度曲线图,嵌入 tkinter |
| 线程管理 | threading | 后台测速 + 主线程 UI 刷新 = 界面不卡死 |
线程模型
┌─────────────────────────────────────────────┐
│ 主线程 (Main) │
│ tkinter.mainloop() │
│ 每200ms: after() → 刷新图表 + 刷新仪表盘 │
└─────────────────────────────────────────────┘
│ 启动 ▲ 读取
▼ │ deque
┌─────────────────┐ ┌──────────────────────┐
│ 测速线程 │ │ 网络监控线程 │
│ (Test Thread) │ │ (Monitor Thread) │
│ │ │ │
│ speedtest 库 │ │ while 测速进行中: │
│ 执行完整流程 │ │ sleep(200ms) │
│ (阻塞式 API) │ │ 读 psutil 计数器 │
│ │ │ push → deque │
└─────────────────┘ └──────────────────────┘
三个线程通过 collections.deque 进行数据交换 — CPython 的 GIL 使得 deque.append 和迭代操作具有原子性,无需额外加锁。
安装与运行
环境要求
- Python 3.7+
- Windows / macOS / Linux
安装依赖
pip install -r requirements.txt
requirements.txt 内容:
speedtest-cli # Speedtest.net 测速后端 psutil # 系统网络流量监控 matplotlib # 实时速度曲线图 requests # HTTP 请求 (备用)
启动程序
python network_speed_test.py
打包为独立 EXE (可选)
pip install pyinstaller pyinstaller --onefile --windowed --name "网络测速工具" network_speed_test.py
项目结构
新建文件夹 (3)/ ├── network_speed_test.py # 主程序 (679 行) ├── requirements.txt # Python 依赖 └── README.md # 本文件
常见问题
Q: 测速结果与实际带宽不符?
A: 测速结果受多种因素影响:WiFi 信号强度、路由器性能、运营商 QoS 策略、同时段网络拥塞等。建议在不同时段多次测试取平均值。
Q: 实时曲线波动很大?
A: 正常现象。psutil 监控的是整个网卡的所有流量(包含后台应用),即使扣除了基线,短时间内也会有波动。最终结果以 speedtest-cli 库返回的精确值为准。
Q: 提示 “speedtest-cli 未安装”?
A: 运行 pip install speedtest-cli 安装即可。如果网络受限,可以手动下载 wheel 包安装。
Q: 提示 “psutil 未安装”?
A: psutil 用于实时曲线功能。运行 pip install psutil 安装。即使没有 psutil,基础测速功能仍然可用(仅无实时曲线)。
Q: 测速失败 / 服务器不可达?
A: 可能是 Speedtest.net 服务器被防火墙拦截,或当前网络不通。请检查网络连接,关闭 VPN/代理后重试。
0 条对“网络测速工具”的回复