【发布时间】:2016-04-01 20:43:21
【问题描述】:
我正在开发一款游戏,我听说 UDP 更适合实时游戏。我知道 socket.io 使用 TCP,并且想知道是否有某种方法可以将其切换到 UDP。我尝试查找它,但只找到了 2012 年左右的帖子,其中说 UDP 仅在浏览器中处于试验阶段。
【问题讨论】:
我正在开发一款游戏,我听说 UDP 更适合实时游戏。我知道 socket.io 使用 TCP,并且想知道是否有某种方法可以将其切换到 UDP。我尝试查找它,但只找到了 2012 年左右的帖子,其中说 UDP 仅在浏览器中处于试验阶段。
【问题讨论】:
从标准浏览器,这是不可能的。
从浏览器客户端,socket.io 使用http 或webSocket 传输。 http 和 webSocket 都是 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?
How to talk to UDP sockets with HTML5?
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 的 webRTC 可能是个好主意。
【讨论】:
虽然已经回答了这个问题,但我想指出,有一些方法可以使用 UDP 实现 socket.io。例如,dgram 完全符合您的要求。
This is 使用 dgram 的 socket.io + UDP 教程。
更新:
Alexandre Lacheze 开发了一个 node.js package 将 UDP 带入浏览器。它还支持socket.io。所以答案现在有点过时了。
更新 2: 原来它只是一个模拟的UDP。不是在浏览器上运行的实际 UDP 协议。
【讨论】:
SimUDP,模拟UDP。