可以使用UDP与socket.io吗?

25

我正在开发一个游戏,听说UDP在实时游戏中表现更优秀。我知道socket.io使用TCP,想知道是否有办法将其切换到UDP。我尝试搜索了一下,但只找到了2012年左右的帖子,该帖子称UDP仅在浏览器中处于试验阶段。

3个回答

39

从标准浏览器来看,这是不可能的。

从浏览器客户端来看,socket.io 使用 httpwebSocket 传输。 httpwebSocket 都是 TCP 连接,而不是 UDP 连接。 因此,浏览器客户端的 socket.io 不使用 UDP,它使用 TCP。

据我所知,没有标准的 UDP 支持可以从常规 HTML 页面 JavaScript 中访问,因此您甚至无法尝试构建自己的使用 UDP 的层。

其他参考资料:

为什么无法从浏览器发送 UDP 数据包

在浏览器中读取 UDP 端口

Chrome 支持 TCP 和 UDP 套接字

编写 Chrome 扩展程序以支持浏览器中的 UDP

如何使用 Web RTC-JavaScript 发送 UDP 数据包?

如何使用 HTML5 与 UDP 套接字通信?

在浏览器中读取 UDP 端口

在有些情况下,当您希望数据包尽快传送,但如果无法立即传送,则放弃该数据包时,UDP可以成为一种理想的传输方式。这在游戏甚至视频流传输中有时很有用,因为下一个数据包将只包含下一个更新,所以如果上一个数据包没有传输成功,那么也没有关系,您不想让TCP尝试重新传输丢失的数据包。 但是,浏览器不支持使用UDP协议从网页Javascript。

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


您可以使用来自node.js或其他非浏览器平台的socket.io库,并为该库编写自己的UDP传输插件,该插件建立在平台本身的本机UDP支持之上。我认为,socket.io具有相对可插拔的传输功能,因此您可以尝试制作自己的传输功能,然后配置客户端和服务器都使用该传输功能。这在浏览器中是不可能的(没有安装在浏览器中的本机代码插件),因为浏览器中没有底层UDP支持可供您构建传输功能,但是在非浏览器环境中(如node.js),您可以这样做。


6
为什么还有人踩我的回答?踩的人请解释一下,如果你有正当理由,我会纠正我的回答。在浏览器中使用Socket.io不会运行在UDP上。这是因为浏览器不支持任何形式的UDP传输。如果你是因为被Ramazan的回答误导而踩我的回答,请阅读下面的评论,因为那个回答非常误导,并没有提供这个问题所要求的内容。 - jfriend00

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

1
这个回答似乎并没有直接回答问题。 - Marjeta
3
我同意当我写这个的时候,我在想socket.io,但是我仍然感谢@TensorVortex提到了另一种方法(假设它可行),因为根据其他回复的说法,socket.io似乎根本不支持UDP。 - Moo

2
虽然问题已经有了答案,但是我想指出实现 socket.io 和 UDP 的方法。例如,dgram 正好满足您的需求。
这是一个使用 dgram 实现 socket.io + UDP 的教程 更新: Alexandre Lacheze 开发了一个 Node.js 软件包,将 UDP 带到浏览器中。它还支持 socket.io。因此,答案现在有点过时。 更新2:事实证明这只是模拟 UDP,并非在浏览器上运行的实际 UDP 协议。

6
我想你可能对这里所描述的内容感到困惑。你提到的第一个参考资料完全运行在node.js上,并不能在浏览器中运行,它只是用于展示内置于node.js中的UDP支持的示例代码。因此,它与在浏览器中使用UDP没有任何关系。你提到的第二个参考资料是模拟了一个类似UDP的接口,但是它是通过webSocket或socket.io传输(都是TCP连接)来实现的。因此,虽然它是在浏览器中模拟了UDP接口,但实际的传输协议是TCP,而不是UDP。因此,这两个参考资料都没有在浏览器中实际运行UDP协议。 - jfriend00
5
第二个例子,当与基于服务器的代理一起使用时,该代理将模拟运行在socket.io上的UDP转换为实际的UDP,并可用于从浏览器与UDP服务通信,但不应被误导认为这是在浏览器中使用UDP以实现响应快、延迟低的游戏所需的原因 - 因为它并非如此。虽然聪明并可能有一些有趣的用途,但这不是本问题所问的如何在UDP上运行socket.io。提示:第二个选项中接口的名称为“SimUDP”,即模拟UDP。 - jfriend00
6
总结一下,你的回答中没有展示socket.io在UDP上运行的实现,因此你的这部分回答是完全不支持的。而且,你声称Alexandre Lacheze的软件包将UDP带到了浏览器,这也是错误的。它实际上将一个模拟的UDP-like接口运行在TCP上,供浏览器使用。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接