从零设计一个多协议下载器:HTTP/FTP/种子/磁力统一调度

举报
樊先生 发表于 2026/11/04 16:37:37 2026/11/04
【摘要】 我做的一个跨平台下载工具,要同时支持 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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。