socket.io 可以使用 UDP 吗?
Is it possible to use UDP with socket.io?
我正在开发一款游戏,听说 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?
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。
我正在开发一款游戏,听说 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?
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。