纯 HTTP 的力量——屏幕共享、实时消息传递、SSH 和 VNC
大家好。今天,我想向您展示纯 HTTP 流的强大功能,它允许我们进行屏幕共享、视频聊天、实时短信、SSH、VNC 等。下面的演示视频显示了纯 HTTP 上的 SSH 和 VNC。让我们深入研究一下!


Web 浏览器上的 SSH
Web 浏览器上的 VNC
为什么是 HTTP?
HTTP 无处不在,适用于所有人和所有事物,它允许我们在任何情况下进行通信。 HTTP 是最成熟的协议之一并且被广泛使用。您可以在个人电脑(包括 Windows、Mac 和 Linux)的网络浏览器中找到 HTTP,在智能手机和平板电脑(包括 Android、iPhone 和 iPad)、终端中的curl、wget命令、一些物联网设备、自动化工具(如ShortcutsiOS 应用程序和Microsoft Flow、Web Hooks 等。此外,HTTP 是一种不断发展的协议,如 HTTP/2、HTTP/3 并且越来越快。
通常,HTTP 请求的生命周期很短,用于获取 HTML/CSS/JavaScript、媒体和 API 请求。所以,这篇文章介绍了长寿命的 HTTP 请求,它在没有 WebSocket 和 WebRTC 的情况下通过纯 HTTP 流进行实时通信。
管道服务器
我制作了Piping Server,它允许我们在每个设备之间传输数据。
nwtgck/管道服务器
使用管道或浏览器通过纯 HTTP 在每个设备之间无限传输
管道服务器
[
](https://microbadger.com/images/ nwtgck/piping-server “在 microbadger.com 上获取您自己的图像徽章”)
通过 HTTP/HTTPS 在每台设备之间无限传输

转账
管道服务器很简单。您可以按以下方式转移。
发送
echo '你好,世界' | curl -T - https://pppng.io/hello
进入全屏模式 退出全屏模式
获取
卷曲 https://pppng.io/hello > hello.txt
进入全屏模式 退出全屏模式
管道服务器将数据传输到POST /hello或PUT /hello到GET /hello。路径/hello可以是/mypath或/mypath/123/等任何内容。指定相同路径的发送方和接收方可以传输。发件人和收件人都可以先开始传输。第一个等待另一个。
您还可以在浏览器上使用 Web UI,例如https://pppng.io。在https://piping-ui.org中可以找到更现代的 UI,它支持 E2E 加密。
流
最重要的是数据是流式传输的。这意味着您可以无限传输任何数据。下面的演示使用seq inf传输无限文本流。

个想法
...
在 GitHub 上查看
管道服务器很简单。指定相同路径(例如/hello)的发送方和接收方可以传输。下图是转移的概念。
[
的概念](https://res.cloudinary.com/practicaldev/image/fetch/s--QJdVm2tA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev -to-uploads.s3.amazonaws.com/i/jc2n5bz3vx76dwqp2g7s.png)
该图显示了 POST/mypath的发件人和收件人 GET/mypath可以传输的内容。发件人和收件人都可以先开始传输。第一个等待另一个。 POST 和 PUT 方法在Piping Server中是相同的。
您可以使用 JavaScript 中的fetch()来传输文本,如下所示。
// Send
fetch("https://ppng.io/hello", {
method: "POST",
body: "hello, world"
});
进入全屏模式 退出全屏模式
// Get
const res = await fetch("https://ppng.io/hello");
console.log(await res.text());
// => "hello, world"
进入全屏模式 退出全屏模式
您也可以使用curl命令,如下所示。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--6P9zYUMS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/sxo2v4pq5llq21exw0pm.gif)
您还可以传输二进制数据,例如图像和视频,如下所示。如您所见,收件人只是在浏览器上打开 URL 来获取图像。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--mexMaZUo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/veuc48jx49423odtn719.gif)
HTTP 无处不在。所以我们可以在没有任何额外工具的情况下自由传输数据。
无限转
Piping Server最显着的特点是允许您传输无限数据。下面的演示显示了将文本流输入到 Web 浏览器中。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--0CCo0fsq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https:// /dev-to-uploads.s3.amazonaws.com/i/j44x8zr5hh8hjymph6u3.gif)
发送文件夹
您可以传输一个文件夹(一个目录),其中包含多个文件,如下所示。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--qz7nHx74--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/nqcq3aik7lfhbt6qhwpk.gif)
# Send folder
tar c ./mydir | curl -T - https://ppng.io/mypath
进入全屏模式 退出全屏模式
# Get folder
curl https://ppng.io/mypath | tar xv
进入全屏模式 退出全屏模式
文件在发送方上传时打包,在接收方下载时正在解包。 Stream 使这成为可能,而无需创建临时文件。
端到端加密您的数据和传输很容易,如下所示。
-
发送:
... | openssl aes-256-cbc | curl -T ... -
得到:
curl ... | openssl aes-256-cbc -d
也很容易通过压缩来减小尺寸,如下所示。
-
发送:
... | gzip | curl -T ... -
得到:
curl ... | zcat
您可以根据需要转换数据,例如gpg、zip或未来发明的工具。结合管道在时间和内存方面都是有效的。 Unix 管道是组合软件的绝佳方式。 Piping Server 的名称来源于 Unix 管道。
Piping Server最常见的用例是文件传输。对于传输文件,您可以使用Piping UI,它允许您在许多设备上通过端到端加密安全传输。
长时间传输海量数据
以下是使用 local 和 remotePiping Server通过 HTTP 传输数据的简单实验。
下面的演示视频显示 45TB 使用cat /dev/zero | curl -T- ...通过远程Piping Server通过 HTTP 传输 2,092 小时(87 天)。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--r8lJy8eq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https:/ /dev-to-uploads.s3.amazonaws.com/i/hpijr3jofzs2rg80v6c6.gif)
下图显示通过本地管道服务器通过 HTTP 传输 1,110TB (≈ 1PB) 64 天。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--pydlBdar--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/ /dev-to-uploads.s3.amazonaws.com/i/p0wd1ww1upnev2q90qcw.png)
这些实验表明,可以通过单个 HTTP 请求连续传输大量数据,并且单个 HTTP 请求的寿命足够长。
Web 浏览器的无限流
通过 HTTP 发送的无限流终于来到了 Web 浏览器!
Google Chrome 85 或更高版本具有作为原始试用版的功能。打开chrome://flags并启用“Experimental Web Platform features”如下
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--3Rdn1c2D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/gxh2jb55z15v10fz5i1b.png)
其他主流浏览器如 Firefox 和 Safari 也对此功能感兴趣。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--Zan_NKy1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads。 s3.amazonaws.com/i/mjxvlrbl9ixbi4atk4b9.png)
上传来自 yutakahirano 的 ReadableStream 主体的请求 · 拉取请求 #425 · whatwg/fetch
简而言之,此功能允许我们发送ReadableStream,如下所示。
fetch("https://example.com", {
method: "POST",
body: <ReadableStream here!>
});
进入全屏模式 退出全屏模式
简单短信
这是 Web 浏览器上的简单文本消息,带有fetch()和ReadableStream。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--PICNtOJZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https:// /dev-to-uploads.s3.amazonaws.com/i/bp82n02rzubl7p9ayg9s.gif)
下面的代码从用户输入创建ReadableStream并将输入流发送到Piping Server。收件人只需在浏览器上打开 URL 并看到流式文本消息。
const readableStream = new ReadableStream({
start(ctrl) {
const encoder = new TextEncoder();
window.myinput.onkeyup = (ev) => {
if (ev.key === 'Enter') {
ctrl.enqueue(encoder.encode(ev.target.value+'\n'));
ev.target.value = '';
}
}
}
});
fetch("https://ppng.io/mytext", {
method: 'POST',
body: readableStream,
headers: { 'Content-Type': 'text/plain;charset=UTF-8' },
allowHTTP1ForStreamingUpload: true,
});
进入全屏模式 退出全屏模式
(完整:https://github.com/nwtgck/piping-server-streaming-upload-htmls/blob/a107dd1fb1bbee9991a9278b10d9eaf88b52c395/text_stream.html)
代码中的allowHTTP1ForStreamingUpload是 Chrome 中的一个临时属性,允许我们通过 HTTP/1.1 使用此功能(请参阅:4c75c0c9f730589ad8d6c33af919d6b105be1462 - chromium/src - Git at Google)。
屏幕共享
您可以以与上面的文本流几乎相同的方式共享您的屏幕。获取MediaStream并转换为ReadableStream并将流发送到管道服务器和fetch()。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--V80uxTzv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/0unx6iydwnvl8ayf5y11.gif)
下面的函数mediaStreamToReadableStream()将MediaStream转换为ReadableStream。
(async () => {
// Get display
const mediaStream = await navigator.mediaDevices.getDisplayMedia({video: true});
// Convert MediaStream to ReadableStream
const readableStream = mediaStreamToReadableStream(mediaStream, 100);
fetch("https://ppng.io/myvideo", {
method: 'POST',
body: readableStream,
allowHTTP1ForStreamingUpload: true,
});
})();
// Convert MediaStream to ReadableStream
function mediaStreamToReadableStream(mediaStream, timeslice) {
return new ReadableStream({
start(ctrl){
const recorder = new MediaRecorder(mediaStream);
recorder.ondataavailable = async (e) => {
ctrl.enqueue(new Uint8Array(await e.data.arrayBuffer()));
};
recorder.start(timeslice);
}
});
}
进入全屏模式 退出全屏模式
(完整:https://github.com/nwtgck/piping-server-streaming-upload-htmls/blob/a107dd1fb1bbee9991a9278b10d9eaf88b52c395/screen_share.html)
收件人只需使用一个<video>标签打开下面的 HTML。
<!-- viewer -->
<video src="https://ppng.io/myvideo" autoplay muted></video>
进入全屏模式 退出全屏模式
这种方式对命令行工具也很友好。您也可以使用curl https://ppng.io/myvideo | ffplay -查看屏幕。您也可以使用ffmpeg命令发送屏幕。有关更多信息,请参阅Capture/Desktop – FFmpeg。
语音和视频聊天
对于语音或视频聊天,您只需将上面的代码const mediaStream =替换为:
// Voice
const mediaStream = navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true } })
进入全屏模式 退出全屏模式
// video + voice
const mediaStream = navigator.mediaDevices.getUserMedia({ video: true, audio: { echoCancellation: true } })
进入全屏模式 退出全屏模式
(语音:https://github.com/nwtgck/piping-server-streaming-upload-htmls/blob/a107dd1fb1bbee9991a9278b10d9eaf88b52c395/simple_phone.html)
(视频+语音:https://github.com/nwtgck/piping-server-streaming-upload-htmls/blob/a107dd1fb1bbee9991a9278b10d9eaf88b52c395/video_chat.html)
然后,您可以使用mediaStreamToReadableStream()将那些MediaStream转换为ReadableStream以在fetch()中指定body:。
视频过滤
你可以从画布上得到MediaStream。下面的函数在内存中创建一个视频和一个画布,并将一个MediaStream转换为另一个。JSManipulate被使用。您可以创建一个过滤器应用程序,如 Snap Camera。
// Filter for sepia
async function sepiaMediaStream(mediaStream) {
const memVideo = document.createElement('video');
memVideo.srcObject = mediaStream;
await memVideo.play();
const width = memVideo.videoWidth;
const height = memVideo.videoHeight;
const srcCanvas = document.createElement('canvas');
const dstCanvas = document.createElement('canvas');
srcCanvas.width = dstCanvas.width = width;
srcCanvas.height = dstCanvas.height = height;
const srcCtx = srcCanvas.getContext('2d');
const dstCtx = dstCanvas.getContext('2d');
(function loop(){
srcCtx.drawImage(memVideo, 0, 0, width, height);
const frame = srcCtx.getImageData(0, 0, width, height);
JSManipulate.sepia.filter(frame);
dstCtx.putImageData(frame, 0, 0);
setTimeout(loop, 0);
})();
return dstCanvas.captureStream();
}
进入全屏模式 退出全屏模式
(完整:https://github.com/nwtgck/piping-server-streaming-upload-htmls/blob/a107dd1fb1bbee9991a9278b10d9eaf88b52c395/screen_share_with_filter.html)
(演示视频:https://youtu.be/VcKJR8D8IFA)
压缩
使用 gzip 压缩数据,如下所示。在 Chrome 中,您可以轻松地使用readableStream.pipeThrough(new CompressionStream('gzip'))压缩流。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s---T242CvW---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/i/15teu6ebr4ikjzosb3at.gif)
const readableStream = new ReadableStream({
pull(ctrl) {
// random bytes
ctrl.enqueue(window.crypto.getRandomValues(new Uint32Array(128)));
}
}).pipeThrough(new CompressionStream('gzip'))
fetch("https://ppng.io/mytext", {
method: 'POST',
body: readableStream,
allowHTTP1ForStreamingUpload: true,
});
进入全屏模式 退出全屏模式
(完整:https://github.com/nwtgck/piping-server-streaming-upload-htmls/blob/a107dd1fb1bbee9991a9278b10d9eaf88b52c395/gzip_inifinite_stream.html)
示例代码发送无限随机字节,压缩超过Piping Server。
无限流的端到端加密
即使服务器不可信,您也可以安全地传输流。您可以使用以下代码加密任何ReadableStreamOpenPGP.js。
// Encrypt ReadableStream with password by OpenPGP
async function encryptStream(readableStream, password) {
const options = {
message: openpgp.message.fromBinary(readableStream),
passwords: [password],
armor: false
};
const ciphertext = await openpgp.encrypt(options);
return ciphertext.message.packets.write();
}
进入全屏模式 退出全屏模式
https://youtu.be/lxpxeB_0UDk是通过管道服务器进行端到端加密屏幕共享的演示视频。
Service Worker 用于查看器端。使用 Service Worker 的目的是为了获取https://localhost:8080/e2ee_screen_share/swvideo#myvideo的解密视频。Service Worker 用作代理。有关详细信息,请参阅完整代码:https://github.com/nwtgck/piping-server-streaming-upload-htmls/tree/a107dd1fb1bbee9991a9278b10d9eaf88b52c395/e2ee_screen_share。
Web 浏览器有Web Crypto,它可以安全地生成密钥并进行 Diffie-Hellman 密钥交换一个不可信的通道。例如Piping UI是一个文件传输工具,通过 ECDH 和OpenPGP.js交换公钥和加密文件。
访问下面的存储库以获取使用fetch()上传流功能和管道服务器的其他示例。
https://github.com/nwtgck/piping-server-streaming-upload-htmls
通过 HTTP 的 SSH
如您所见,任何数据都可以通过 HTTP 传输。因此,这意味着协议可以通过 HTTP 通过Piping Server。
为什么是管道服务器?
有一些环境不能公开端口。对于这种环境,当你只有 HTTP/HTTPS 端口的外向连接时,你可以使用 SSH。一个可能的例子是 GitHub Actions,它不支持像 CircleCI 那样的 SSH 调试(参见:GitHub Actions over Piping Server](https://github.com/nwtgck/actions-comment-run/tree/0cd21bd0c811a3f27ea219bdb5788cc2dc23d789#ssh-in-github-actions-over-piping-server)中的[SSH)。
JavaScript 中的 SSH 客户端
我找到了一个很棒的项目,SSHy,它的 JavaScript 会说 SSH。数据通信是通过 WebSocket 进行的,所以我只需要使用fetch()将 WebSocket 切换到 HTTP。不幸的是,虽然SSHy现在没有积极维护,但这非常适合我的概念证明,使用管道通过 HTTP 讲 SSH服务器。我们可以通过使用Emscripten来移植 OpenSSH,编写 Rust 并编译为 Web Assembly,或者将来做一些事情。
通过使用SSHy,可以仅使用 Web 浏览器和管道服务器进行 SSH。传输到Piping Server的数据是安全加密的,因为通信是 SSH。
如何通过管道服务器进行 SSH?
在管道服务器上创建两组连接,用于双工通信。其中之一是用于向您的对等方发送数据。另一种是用于从对等方接收数据。在 HTTP/2 上,多个 HTTP 请求被捆绑到一个 TCP 连接中。
下面的命令是通过Piping Server通过 HTTP 转发 22 端口的示例。这种方式是由@Cryolite在日本伟大的帖子https://qiita.com/Cryolite/items/ed8fa237dd8eab54ef2f中提出的。 22端口的数据是从/path1下载的,22端口的数据是上传到/path2的。
# server-host
socat 'EXEC:curl -NsS https\://ppng.io/path1!!EXEC:curl -NsST - https\://ppng.io/path2' TCP:127.0.0.1:22
进入全屏模式 退出全屏模式
这种方式可以在不通过 HTTP 发布公共端口的情况下进行 NAT 遍历。
下面的命令使用上面的命令创建隧道。 22 端口被转发到您另一台机器的 31376 端口。
# client-host
socat TCP-LISTEN:31376 'EXEC:curl -NsS https\://ppng.io/path2!!EXEC:curl -NsST - https\://ppng.io/path1'
进入全屏模式 退出全屏模式
您可以在另一个终端的机器中执行ssh -p 31376 <user>@localhost。这是一种将端口转发到另一台设备的通用方式,而不仅仅是 SSH。
SSHy 的传输实现
下面的实现通过 WebSocket 发送字节。
https://github.com/stuicey/SSHy/blob/82941c8ae15359fd387109dcee3a218808df0bb0/index.html#L259-L264
ws,WebSocket 实例有一个用户定义的方法,sendB64()并发送 Base64 编码的字符串。使用了一个名为stuicey/wsproxy的代理服务器,用于将 WebSocket 代理到 TCP(在本例中为 SSH)。
下面的实现通过 WebSocket 接收字节。
https://github.com/stuicey/SSHy/blob/82941c8ae15359fd387109dcee3a218808df0bb0/index.html#L233-L236
SSH 通过管道服务器
这些发送和接收部分被替换为fetch()和一个使用方式管道服务器。下面的代码是替换的实现。
https://github.com/nwtgck/piping-ssh-web/blob/287e89ef05173e69d1302b29acf2abbe858ee78b/index.html#L187-L219
该应用程序称为管道 SSH。这是一个演示视频。在其中,从 Web 浏览器登录 Ubuntu 机器并输入ls和htop命令。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--q1ZwW5vp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/ybf1uh546zgbb9dpefo8.gif)
-
申请:https://piping-ssh.nwtgck.org
-
GitHub:https://github.com/nwtgck/piping-ssh-web
TIPS:SSH 的保活
在 Chrome 中,当 60 秒内没有字节到达时,HTTP 请求将停止。要解决此问题,您可以在 SSH 服务器设置中设置/etc/ssh/sshd_config,如下所示。
# /etc/ssh/sshd_config
# ...
ClientAliveInterval 20
ClientAliveCountMax 3
# ...
进入全屏模式 退出全屏模式
通过 HTTP 的 VNC
VNC(虚拟网络计算)广泛用于远程控制计算机。
这是演示视频。前面的窗口是 Chrome、Web 浏览器,后面的窗口是 VirtualBox 上的 Ubuntu 上的受控机器。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--S9cTHGY6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/gm08i1qrqkfuzy9p22kx.gif)
-
申请:https://piping-vnc.nwtgck.org
-
GitHub:https://github.com/nwtgck/piping-vnc-web
对于 Ubuntu 20.04 用户,要启用 VNC,您可以打开设置 > 共享并运行gsettings set org.gnome.Vino require-encryption false以避免错误“连接时失败:不支持的安全类型(类型:18)”。
VNC 也可用于 Windows。这是一个从 Chrome 控制 Windows 10 的演示。由于下面演示中的 Windows 机器是在 VirtualBox 上运行的,因此在真正的 Windows 机器上运行更加流畅。UltraVNC正在 Windows 机器上运行。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--SRqrFhSM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev -to-uploads.s3.amazonaws.com/i/xc72hqv25a083sftd1bw.gif)
Android Chrome 也可以使用获取上传功能。下面的演示通过 Android 智能手机控制 Windows 10。
[
控制的管道VNC](https://res.cloudinary.com/practicaldev/image/fetch/s--lCP94KtX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev -to-uploads.s3.amazonaws.com/i/ummq5s2lsf37csq225q8.gif)
对于 Windows 用户,您可以在此处通过管道服务器下载隧道工具:https://github.com/nwtgck/go-piping-tunnel。创建一个简单的 .bat 文件很方便,如下所示。
.\piping-tunnel server -p 5900 path1 path2
进入全屏模式 退出全屏模式
piping-tunnel具有与socat+curl命令相同的功能。 mac用户可以通过brew install nwtgck/piping-tunnel/piping-tunnel安装。
工作原理
该应用程序完全基于noVNC,这是一个用 JavaScript 编写的 VNC 客户端。只有传输实现被替换为使用 fetch 和Piping Server代替 WebSocket 的方式。
这是用 fetch 和Piping Server替换 WebSocket 传输的差异。
https://github.com/nwtgck/piping-vnc-web/commit/1e1f2863160bfab8c9fbfc4c6970cd2b31135bfd
Web 浏览器中的网络
这是 Chrome DevTools 中的网络。只有两个纯 HTTPS 连接。v86正在上传,7vk正在下载。如您所见,v86的下载大小正在增加。虽然7vk正在上传,但当前 Chrome 中的视图显示“待处理”。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--RmQEL2rg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/xawnbz1123x94qm2rzz8.gif)
fetch() 上传流
我一直在关注这个功能。以下是获取有关 fetch() 上传流功能信息的有用链接。
-
whatwg:获取标准
-
whatwg 问题:上传来自 yutakahirano 的 ReadableStream 正文的请求 · Pull Request #425 · whatwg/fetch
-
Chromium 提交:688906- 流式上传支持 - 铬
-
fetch() 上传流 - Chrome 平台状态
-
web.dev:使用 fetch API的流式传输请求
-
Firefox:1387483 - [Meta-Bug] 支持 ReadableStream 作为 fetch API 中的 Request.body
-
Firefox:1469359 - 在颈部的 fetch API 中支持 ReadableStream 作为 Request.body
-
Safari:203617– 在获取()已记录到控制台的请求时,“不支持 ReadableStream 上传”
公共管道服务器
这是公共管道服务器。
-
https://pppng.io
-
别名:https://piping.ml
-
这些别名将来可以是不同的服务器。
-
https://piping.glitch.me
-
https://piping-47q675ro2guv.runkit.sh
-
https://pppng.herokuapp.com(注意:Heroku 不支持流式传输)
自托管管道服务器
使用 Docker 在http://localhost:8080上运行Piping Server,如下所示。
docker run -p 8080:8080 nwtgck/piping-server
进入全屏模式 退出全屏模式
单个二进制文件也可在https://github.com/nwtgck/piping-server-pkg上获得。
这里有更简单的公开管道服务器的方法是使用 Glitch 和 Runkit。
- 从混音 https://glitch.com/~piping并提供服务
从https://runkit.com/nwtgck/piping/克隆* 并提供服务
具有 JWT 身份验证的管道服务器
要限制用户使用Piping Server,您可以使用https://github.com/nwtgck/jwt-piping-server以使用Auth0为例。
Rust 中的管道服务器
Piping Server 也是用 Rust 编写的。这是目前最快的管道服务器。
GitHub:https://github.com/nwtgck/piping-server-rust
基数
这是我基于这篇文章的帖子。
-
每个设备之间通过 HTTP/HTTPS 的数据流
-
(日语):https://scrapbox.io/nwtgck/Web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E4%B8%8A%E3% 81%A7%E7%B4%94%E7%B2%8B%E3%81%AAHTTP%E3%81%A0%E3%81%91%E3%81%A7%E5%8D%98%E6%96% B9%E5%90%91%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E9%80%9A% E4%BF%A1%E3%82%92%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%99%E3%82%8BHTTP%E3%81%AE%E3% 82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%A2%E3%83% 83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%8C%E9%81%82%E3%81%AB%E3%82%84% E3%81%A3%E3%81%A6%E3%81%8F%E3%82%8B
-
(日语):https://scrapbox.io/nwtgck/SSH%E6%8E%A5%E7%B6%9A%E3%82%92Web%E3%83%96%E3%83%A9%E3% 82%A6%E3%82%B6%E3%81%AE%E7%B4%94%E7%B2%8B%E3%81%AAHTTP%E4%B8%8A%E3%81%A7%E5%AE% 9F%E7%8F%BE%E3%81%99%E3%82%8B
-
(日语):https://scrapbox.io/nwtgck/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88PC%E6%93%8D%E4%BD %9C%E3%82%92Web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AE%E7%B4%94%E7%B2%8B %E3%81%AAHTTP%E4%B8%8A%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%EF%BC%88VNC%EF %BC%89
更多
下面的链接是Piping Server的存储库。
GitHub:https://github.com/nwtgck/piping-server
从以下链接获取更多关于Piping Server的信息,例如端到端加密文件传输,具有基本身份验证,实时绘图等。
https://github.com/nwtgck/piping-server/wiki/Ecosystem-around-Piping-Server
更多推荐

所有评论(0)