从零设计一个多协议下载器:HTTP/FTP/种子/磁力统一调度
【摘要】 我做的一个跨平台下载工具,要同时支持 HTTP、FTP、BitTorrent 种子、磁力链接四种协议,还要 Windows 和 Android 双端跑。这篇拆它的架构:一个 Go 引擎 + 一套 Flutter 界面,怎么把四种协议统一到同一套任务模型里。
一、为什么不做成四套独立程序
用户要的是"一个 app 里粘贴任何链接都能下"。如果每种协议各写一套 UI 和状态机,维护噩梦。所以我定的目标是:协议可插拔,任务模型统一。
二、整体架构
┌─────────────┐ 本地 HTTP API ┌──────────────────┐
│ Flutter UI │ ←──────────────────→ │ Go 下载引擎 │
│ (Win/And) │ 127.0.0.1:引擎端口 │ (四种协议适配器) │
└─────────────┘ └──────────────────┘
- UI 与引擎彻底分离:引擎只暴露本地 HTTP API,UI 用 gomobile 把引擎打成 AAR 给 Android、直接跑二进制给 Windows;
- 引擎只监听
127.0.0.1,不对外网暴露,安全边界清晰。
三、统一任务模型
所有协议抽象成一个 Task:
Task {
id, url, protocol, // http / ftp / torrent / magnet
state, // 等待/下载中/暂停/完成/出错
total, downloaded, speed,
files[] // 种子可能是多文件
}
每个协议实现同一组接口:Add / Pause / Resume / Remove / Progress。UI 只认 Task,不关心底下是 HTTP 还是 BT。
四、四种协议的差异怎么抹平
- HTTP/FTP:单文件流式,最简单;
- BT 种子:先解析
.torrent拿到文件列表,再连 DHT/peer 下载,天然多文件; - 磁力:没有
.torrent文件,先靠 DHT 解析出元数据(magnet→torrent),再走 BT 流程。
⚠️ 磁力解析依赖 DHT 网络,冷门资源可能几十秒才"冷启动"出元数据,UI 上要显示"解析中"而不是假死。我一开始没做这状态,用户以为卡了狂点,反而把任务搞乱。
五、双端打包的坑(详见另一篇 Flutter 双端打包,这里只点架构)
引擎用 Go 写一次,通过 gomobile 编译成 Android 的 AAR + 通过交叉编译出 Windows exe。UI 用同一套 Dart 代码,两端口径一致。
六、性能与资源
BT 同时跑多个任务时,磁盘随机写会打满。我做了写入合并 + 单任务并发分片,把随机写变成顺序大块写,机械盘上速度翻倍。
【总结】 多协议下载器的核心不是"会下载四种协议",而是"让四种协议在用户眼里是同一件事"。引擎/UI 分离 + 统一任务模型,是能长期维护的关键。跨端靠"引擎一次编写、多端编译"。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)