Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 是否可以将UDP与socket.io一起使用?_Sockets_Tcp_Socket.io_Udp - Fatal编程技术网

Sockets 是否可以将UDP与socket.io一起使用?

Sockets 是否可以将UDP与socket.io一起使用?,sockets,tcp,socket.io,udp,Sockets,Tcp,Socket.io,Udp,我有一个游戏,我正在工作,我听说UDP是优越的实时游戏。我知道socket.io使用TCP,我想知道是否有办法将其切换到UDP。我试着查找,但只找到了2012年左右的帖子,上面说UDP只是在浏览器中进行实验 从标准浏览器,这是不可能的 从浏览器客户端,socket.io使用http或webSocket传输。http和webSocket都是TCP连接,而不是UDP连接。因此,浏览器客户端socket.io不使用UDP,而是使用TCP 据我所知,在可从常规HTML页面Javascript访问的浏览器

我有一个游戏,我正在工作,我听说UDP是优越的实时游戏。我知道socket.io使用TCP,我想知道是否有办法将其切换到UDP。我试着查找,但只找到了2012年左右的帖子,上面说UDP只是在浏览器中进行实验

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

从浏览器客户端,
socket.io
使用
http
webSocket
传输。
http
webSocket
都是TCP连接,而不是UDP连接。因此,浏览器客户端socket.io不使用UDP,而是使用TCP

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

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

在某些情况下,当您希望尽快传递数据包时,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的socket.io+UDP教程

更新

开发了一个node.js,将UDP引入浏览器。它还支持socket.io。因此,答案在某种程度上已经过时了

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

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

我想您可能会对这里描述的内容感到困惑。您的第一个引用完全在node.js上运行,而不在浏览器中运行。这只是UDP支持bulit到node.js的示例代码。因此,这与浏览器中的UDP无关。您的第二个参考是模拟类似UDP的接口,但通过webSocket或socket.io传输(两者都是TCP连接)运行它。这是一个在浏览器中工作的模拟UDP接口,但实际传输是TCP,而不是UDP。因此,它们都没有在浏览器中运行实际的UDP协议。第二个示例,当与基于服务器的代理一起使用时,将通过socket.io运行的模拟UDP转换为实际的UDP,可用于从浏览器与UDP服务通信,但人们不应该被愚弄到认为这是在浏览器中使用UDP,因为人们通常希望使用UDP进行响应性强、低延迟的游戏——事实并非如此。它很聪明,可能有一些有趣的用途,但这并不是这个问题所要问的问题,即如何在UDP上运行socket.io。仅供参考,第二个选项中的接口名称是
SimUDP
,模拟UDP。因此,总结一下。答案中没有任何内容显示socket.io在UDP上运行的实现,因此部分答案完全不受支持。而且,您断言Alexandre Lacheze的包将UDP引入浏览器也是错误的。它给浏览器带来了一个模拟的UDP接口,它实际上是通过TCP运行的。为什么还要进行另一次向下投票呢?请解释一下。如果你有合法的牛肉,我会更正我的答案。浏览器中的Socket.io不在UDP上运行。这根本不存在,因为浏览器不支持任何类型的UDP传输。如果你因为被Ramazan的答案误导而投反对票,那么请阅读该答案下面的评论,因为该答案非常具有误导性,并且没有提供该问题所要求的内容。该答案似乎没有直接回答该问题。虽然我同意,当我写这篇文章时,我想到的是socket.io,我仍然很感激@TensorVortex提到了另一种方法(假设它有效),因为基于其他响应的socket.io似乎根本不支持UDP。