Node.js 为什么我的socket.io使用长轮询而不是websocket?

Node.js 为什么我的socket.io使用长轮询而不是websocket?,node.js,socket.io,Node.js,Socket.io,所以我用NodeJS+ExpressJS服务器设置了socket.io,一切正常。唯一的问题是我刚刚意识到我的emit()调用使用回退XHR方法将事件发送到我的服务器,而不是它打开的websocket连接 当我查看连接时,我看到的只是一些2probe,3probe,然后是通过websocket发送的一组2和3。这个连接看起来是开放的,并且正在工作,那么为什么它会退回到使用XHR请求的长轮询呢 我现在没有提供任何代码,因为我不确定哪些部分是相关的,因为代码的功能方面工作得很好,我只想通过XHR使用

所以我用NodeJS+ExpressJS服务器设置了socket.io,一切正常。唯一的问题是我刚刚意识到我的
emit()
调用使用回退XHR方法将事件发送到我的服务器,而不是它打开的websocket连接

当我查看连接时,我看到的只是一些
2probe
3probe
,然后是通过websocket发送的一组2和3。这个连接看起来是开放的,并且正在工作,那么为什么它会退回到使用XHR请求的长轮询呢

我现在没有提供任何代码,因为我不确定哪些部分是相关的,因为代码的功能方面工作得很好,我只想通过XHR使用websocket。如果您想查看任何代码,请告诉我

更新


因此,我对套接字进行了更多的测试,并添加了更多的
emit()
调用。看起来,第一个1或2个emit使用长轮询,然后突然变为使用websocket。只是好奇这里发生了什么。

自从Socket.IO 1.x以来,回退算法从降级方法变为升级方法


长轮询几乎在任何地方都有效,因此首先使用长轮询,以便您可以立即获得“连接”。然后在后台,尝试将长轮询连接升级为websocket连接。如果升级成功,长轮询将停止,会话将切换到websocket连接。如果不成功,长轮询“连接”将保持打开状态并继续使用。

Ahh这很有意义!谢谢