#bittorrent #http-api #web-ui #http-client #download #protocols #client-server

应用 gnostr-bits

为 gnostr 提供的 bittorrent 服务

2 个版本

0.0.2 2024年2月9日
0.0.1 2024年2月7日

#483 in Web 编程

Apache-2.0

31KB
427

crates.io crates.io docs.rs

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 前端的 薄包装器

发布版 中下载。

rqbit Desktop

性能

如桌面应用程序截图所示,它运行得很快。根据一些报告,它比他们尝试过的其他客户端速度快,至少在使用默认设置时是这样。

服务器的内存使用量通常在几十兆字节以内,这使得它非常适合例如 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