百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

WebTorrent 替代 WebRTC 火了!可以自己做 QQ 了?

zhezhongyun 2025-01-09 17:22 55 浏览

家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

1. 什么是 WebTorrent

WebTorrent 是适用于 Node.js 和浏览器的流式 torrent 客户端,完全由 JavaScript 编写,因此相同的代码可以在多个运行时中运行。

The streaming torrent client. For node.js and the web.

但是 WebTorrent 对 Node.js 的浏览器的支持原理完全不同:

  • Node.js :WebTorrent 使用 TCP 和 UDP 与其他 torrent 客户端通信
  • 浏览器:WebTorrent 使用 WebRTC 进行点对点内容传输,无需任何浏览器插件、扩展或安装过程即可快速使用。

但是需要注意的是,WebTorrent 不支持浏览器中的 UDP/TCP 对等点。

为了使 BitTorrent 借助于 WebRTC 这个唯一的 Web 上 P2P 文件传送能力,WebTorrent 对协议进行了一些更改。 因此,基于浏览器的 WebTorrent 客户端或 “web peer” 只能连接到支持 WebTorrent/WebRTC 的其他客户端。

为了将任何文件传送到 Web 对等点,开发者可以采用以下方式:

  • WebTorrent 的客户端,例如: WebTorrent Desktop
  • 命令行程序:webtorrent-hybrid
  • 网站:使用 Instant.io ,同时 Vuze torrent 客户端已添加 WebTorrent 支持

目前 WebTorrent 在 Github 上通过 MIT 协议开源,有超过 28.8k 的 star、2.7k 的 fork、3.8k 的项目依赖量,代码贡献者 200+、妥妥的前端优质开源项目。

2.WebTorrent 的优势概览

WebTorrent 的独特优势可以概括为以下几点:

  • 支持 Node.js 和浏览器环境且使用相同 npm 包,纯 Javascript 无任何本机依赖
  • 非常快速,支持多种子同时下载、同时将文件公开为流
  • 按需从 Web 获取片段,甚至在 torrent 完成之前支持搜索
  • 支持高级 torrent 客户端功能,支持多策略之间无缝切换
  • 用 ut_metadata 支持 Magnet URI,用 dht、tracker、lsd 和 ut_pex 实现对等发现
  • 用于添加新扩展的协议扩展 API、全面的测试套件且完全离线运行
  • 充分利用浏览器 / WebRTC 环境特性,无需任何插件实现 P2P 传送
  • 支持将视频种子流式传输到 <video> 标签(webm、mkv、mp4、ogv、mov 等(AV1、H264、HEVC*、VP8、VP9、AAC、FLAC、MP3、OPUS、Vorbis 等))
  • 支持 Chrome、Firefox、Opera 和 Safari 等大多数主流浏览器

3. 如何使用 WebTorrent

3.1 WebTorrent 基础用法

开发者只需在页面上包含 webtorrent.min.js 脚本即可开始使用 BitTorrent 协议通过 WebRTC 获取文件,或者使用 browserify 或 webpack 从 “webtorrent” 包导入 WebTorrent。

import WebTorrent from 'webtorrent'

下面是浏览器中文件下载代码示例:

import WebTorrent from 'webtorrent'

const client = new WebTorrent()
const magnetURI = '...'
client.add(magnetURI, torrent => {
  // Got torrent metadata!
  console.log('Client is downloading:', torrent.infoHash)
  for (const file of torrent.files) {
    document.body.append(file.name)
  }
})

WebTorrent 开箱即用的支持视频、音频、图像、PDF、Markdown 等文件类型,同时提供其他方法直接访问文件内容,包括:Stream 流、Buffer 缓冲区或 Blob URL。视频和音频内容还可以流式传输,即在下载完整文件之前开始播放。

注意:下载 torrent 会自动为其添加种子,使其可供其他人下载

在浏览器中传送文件更加简单,比如下面的示例:

import dragDrop from 'drag-drop'
import WebTorrent from 'webtorrent'

const client = new WebTorrent()
// 当用户在浏览器中拖拽文件时创建一个 WebTorrent 然后发送
dragDrop('body', files => {
  client.seed(files, torrent => {
    console.log('Client is seeding:', torrent.infoHash)
  })
})

注意,以上示例使用 drag-drop 包,使 HTML5 拖放 API 更易于使用。注意:如果不使用 browserify 等打包工具则可以使用独立文件 dragdrop.min.js。

3.2 WebTorrent 在 Node.js 中使用

在 Node.js 环境中,如果要使用可由浏览器对等点下载的 torrent(即支持 WebRTC)需要 webtorrent-hybrid。

import WebTorrent from 'webtorrent-hybrid'
const client = new WebTorrent()
client.seed('/seed-me.txt', function (torrent) {
    console.log('Client is seeding' + torrent.magnetURI)
})

这是因为在 node.js 中,webtorrent 包仅连接到普通的 TCP/UDP 对等点,而不是 WebRTC 对等点。而 webtorrent-hybrid 支持连接到所有类型的对等点,包括 WebRTC 对等点。

参考资料

https://github.com/webtorrent/webtorrent

https://github.com/feross/drag-drop

https://webtorrent.io/intro

https://github.com/webtorrent/webtorrent-hybrid

https://speakerdeck.com/feross/webtorrent-bringing-p2p-to-the-masses-with-webrtc

https://forums.raspberrypi.com/viewtopic.php?t=255038

相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...