2 个版本
0.0.2 | 2024年2月9日 |
---|---|
0.0.1 | 2024年2月7日 |
#483 in Web 编程
31KB
427 行
rqbit - 基于 Rust 的 bittorrent 客户端
rqbit 是一个用 Rust 编写的 bittorrent 客户端。具有 HTTP API 和 Web UI,可作为库使用。
同时还有一个使用 Tauri 构建的桌面应用程序(在 Windows 和 OSX 上)。
使用快速入门
可选 - 启动服务器
假设您正在下载到 ~/Downloads。
rqbit server start ~/Downloads
下载种子
假设您正在下载到 ~/Downloads。如果服务器已启动,则可以省略 ~/Downloads
。
rqbit download -o ~/Downloads 'magnet:?....' [https?://url/to/.torrent] [/path/to/local/file.torrent]
Web UI
通过 https://127.0.0.1:3030/web/ 访问。它与桌面应用程序类似,请参阅下面的截图。
桌面应用程序
桌面应用程序是 Web UI 前端的 薄包装器。
在 发布版 中下载。
性能
如桌面应用程序截图所示,它运行得很快。根据一些报告,它比他们尝试过的其他客户端速度快,至少在使用默认设置时是这样。
服务器的内存使用量通常在几十兆字节以内,这使得它非常适合例如 RaspberryPI。
CPU 主要用于 SHA1 校验和。
安装
在 发布版 中提供了预构建的二进制文件。如果有人想将 rqbit 放入例如 homebrew,欢迎提交 PR :)
如果您已安装 Rust 工具链,则应可以正常工作
cargo install rqbit
构建
这是一个常规的 Rust 二进制构建过程。
cargo build --release
有用的选项
-v
增加详细程度。可能的值:trace、debug、info、warn、error。
--list
将打印出种子文件的或磁力链接的内容。
--overwrite
如果您想重新下载已存在的文件,则需要添加此选项。
--peer-connect-timeout=10s
这将增加默认的节点连接超时时间。默认值是2秒,有时可能不够。
-r / --filename-re
在此处使用正则表达式来选择文件。
功能和缺少的功能
一些支持的功能
- 顺序下载(默认且唯一选项)
- 如果文件已存在于磁盘上,则恢复下载文件
- 使用正则表达式按文件名选择下载
- DHT支持。允许磁力链接工作,并提供更多节点。
- HTTP API
- 暂停/恢复/删除(带文件或不带文件)API
- 有状态服务器
- Web UI
错误、缺少的功能和其他注意事项
PRs非常受欢迎。
- 仅支持通过TCP的BitTorrent V1
- 由于这是为了个人需求和教学目的而创建的,因此文档、提交信息质量等方面还有很多需要改进的地方。
HTTP API
默认监听于 http://127.0.0.1:3030。
curl -s 'http://127.0.0.1:3030/'
{
"apis": {
"GET /": "list all available APIs",
"GET /dht/stats": "DHT stats",
"GET /dht/table": "DHT routing table",
"GET /torrents": "List torrents (default torrent is 0)",
"GET /torrents/{index}": "Torrent details",
"GET /torrents/{index}/haves": "The bitfield of have pieces",
"GET /torrents/{index}/peer_stats": "Per peer stats",
"GET /torrents/{index}/stats/v1": "Torrent stats",
"GET /web/": "Web UI",
"POST /rust_log": "Set RUST_LOG to this post launch (for debugging)",
"POST /torrents": "Add a torrent here. magnet: or http:// or a local file.",
"POST /torrents/{index}/delete": "Forget about the torrent, remove the files",
"POST /torrents/{index}/forget": "Forget about the torrent, keep the files",
"POST /torrents/{index}/pause": "Pause torrent",
"POST /torrents/{index}/start": "Resume torrent"
},
"server": "rqbit"
}
通过HTTP API添加种子
curl -d 'magnet:?...'http://127.0.0.1:3030/torrents
或者
curl -d 'http://.../file.torrent'http://127.0.0.1:3030/torrents
或者
curl --data-binary@/tmp/xubuntu-23.04-minimal-amd64.iso.torrent http://127.0.0.1:3030/torrents
支持的查询参数,全部为可选
- overwrite=true|false
- only_files_regex - 匹配文件名的正则表达式字符串
- output_folder - 下载到的文件夹。如果未指定,则默认为rqbit服务器启动时的文件夹
- list_only=true|false - 如果只想列出种子中的文件而不是下载
代码组织
- crates/rqbit - 主要二进制文件
- crates/librqbit - 主要库
- crates/librqbit-core - 种子工具
- crates/bencode - bencode序列化/反序列化
- crates/buffers - 二进制缓冲区的包装器
- crates/clone_to_owned - 使某物可拥有的特性
- crates/sha1w - sha1库的包装器
- crates/peer_binary_protocol - 与节点通信的协议
- crates/dht - 分布式哈希表实现
- desktop - 使用Tauri构建的桌面应用程序
动机
首先,我喜欢Rust。该项目纯粹是为了编写Rust代码的过程而创建的。
我对我的常规bittorrent客户端不满意,想知道从头开始创建一个新的客户端需要多少工作量,然后它就变成了现在这样,从bencode协议实现开始,然后是节点协议等等。
依赖关系
~24–41MB
~699K SLoC