socket.io 何时使用轮询而不是 WebSocket?

7
我对socket.io不是很熟悉,但已经用node/express/socket.io编写了我的第一个应用程序。目前在我的nginx服务器上一切正常。我想将我的应用程序发布到公众,但我担心它可能无法为许多人工作。我有一些朋友测试了我的应用程序,一切都很顺利(这是一个相当简单的应用程序)。我的担忧是:现在每个连接似乎都在使用websocket,这正是我想要的。但是,由于客户端的某些奇怪情况,我的应用程序是否会有时降级到“轮询”?如果是这样,socket.io如何决定何时使用轮询和何时使用websocket(是基于浏览器/版本、连接还是其他什么)?我相信它会尽可能使用websocket,但是否有条件列表会使其降级到“轮询”?此外,是否有一种方法可以通过使用“轮询”来测试我的应用程序以查看它是否有效?
1个回答

8
客户端只会在浏览器不支持 WebSocket(例如非常老的客户端)或者客户端路径中的某个代理不支持 WebSocket 的情况下,降级为 AJAX 轮询。假设您的服务器支持 AJAX 轮询,这是唯一的时间。
WebSocket 在 IE10+ 和其他所有较新版本的浏览器中都得到了支持。因此,实际上仅有 IE8 或 IE9 或行为不良的代理可能不支持客户端 WebSocket。
除了缺乏支持之外,没有其他条件会将连接“降级”为轮询。
您可以通过仅在从客户端连接时传递 xhr-polling 传输选项来临时使用轮询来测试应用程序,以告诉客户端那是唯一允许的传输选项。
请记住,所有 WebSocket 连接都始于一个 HTTP 请求,然后如果双方都同意,则“升级”为 WebSocket 协议,因此,如果您正在查看浏览器的网络跟踪,则应该看到每个 WebSocket 连接都始于一个 HTTP 请求 - 这是正常的。并且,在最新版本的 socket.io 中,它实际上可能会在成功尝试并切换到实际的 WebSocket 之前与轮询传输交换几个数据包。

嗨,强调一下@jfriend00所说的一点:在socket.io 1.0+中,默认情况下连接始终以多个HTTP“轮询”请求开始,尽管您可以按照此处描述的方式跳过这些请求。 - Erik Koopmans

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