socket.io 可以使用 UDP 吗?

Is it possible to use UDP with socket.io?

我正在开发一款游戏,听说 UDP 更适合实时游戏。我知道 socket.io 使用 TCP,想知道是否有某种方法可以将其切换为 UDP。我尝试查找它,但只找到了 2012 年左右的帖子,其中说 UDP 仅在浏览器中处于试验阶段。

在标准浏览器中,这是不可能的。

从浏览器客户端,socket.io 使用 httpwebSocket 传输。 httpwebSocket 都是 TCP 连接,不是 UDP 连接。所以浏览器客户端 socket.io 不使用 UDP - 它使用 TCP。

据我所知,可从常规 HTML 页面 Javascript 访问的浏览器不支持标准 UDP,因此您甚至无法真正尝试构建自己的使用 UDP 的层。

关于该主题的其他参考资料:

Why Can't I Send UDP Packets From a Browser

Reading from udp port in browser

Chrome Supports TCP and UDP Sockets

Write a chrome extension to support UDP in browser

How to send a UDP Packet with Web RTC - Javascript?

Reading from udp port in browser

在某些情况下,当您希望尽快传送数据包时,UDP 可能是一种理想的传输方式,但如果不能立即传送,则将其丢弃。这有时在游戏甚至视频流中很有用,其中下一个数据包将只包含下一个更新,因此如果前一个数据包没有通过,那么没什么大不了的,你不希望 TCP 尝试重新传输丢失的数据包。但是,浏览器不支持从网页 Javascript.

使用 UDP 协议

如果您想从浏览器连接到 UDP 设备或服务器,则必须使用某种代理,以便您的浏览器代码可以通过 TCP(http 或 webSocket)与代理通信,然后与代理通信可以处理与设备的实际 UDP 通信。


可以使用 node.js 的 socket.io 库或其他一些非浏览器平台,并为 socket.io 编写您自己的 UDP 传输插件您平台中的本机 UDP 支持。我相信 socket.io 有某种程度上可插入的传输方式,因此您可以尝试创建自己的传输方式,然后将客户端和服务器配置为使用该传输方式。这在浏览器中是不可能的(浏览器中没有安装本机代码插件),因为浏览器中没有底层 UDP 支持,您可以在其上构建传输,但在 node.js 这样的非浏览器环境中,你可以做到。

虽然问题已经回答了,但我想指出的是,有一些方法可以用 UDP 实现 socket.io。例如 dgram 完全符合您的要求。

This is socket.io + UDP 与 dgram 的教程。

更新:

Alexandre Lacheze developed a node.js package 将 UDP 引入浏览器。它还支持 socket.io。所以答案现在已经过时了。

更新 2: 原来它只是一个模拟的UDP。在浏览器上不是实际的 UDP 协议 运行。

在这种情况下使用 webRTC 可能是个好主意,它本质上是 UDP。