socket.io 什么时候使用轮询而不是 websockets?

When does socket.io use polling instead of websockets?

我是 socket.io 的新手,我已经在 node/express/socket.io 中编写了我的第一个应用程序。现在一切都在我的 nginx 服务器上运行良好。我想将我的应用程序发布到 public,但我担心它对很多人不起作用。我有几个朋友测试了我的应用程序,一切都很顺利(这是一个非常简单的应用程序)。这是我的担忧:现在每个连接似乎都在使用 websockets,这正是我想要的。但是我的应用有时会因为客户端的一些奇怪的事情而降级到 "polling" 吗?如果是这样,socket.io 如何决定何时使用轮询以及何时使用 websocket(是基于 browser/version 还是连接还是什么)?我很确定它会在可能的情况下使用 websocket,但是是否有某个条件列表可以将其降低到 "polling"?另外,有没有一种方法可以通过使用 "polling" 来测试我的应用程序,看看它是否有效?

我可以 post 编码,但我认为这是关于 socket.io 如何工作的一般性问题。

客户端降级到 ajax 轮询(假设您的服务器确实支持它)的唯一时间是当浏览器客户端不支持 webSockets(例如,一个非常老的客户端)或者可能如果客户端路径中的某些代理不支持 webSockets。

webSockets 在 IE10+ 和所有其他浏览器的最新版本中受支持。

所以,实际上,它实际上只是 IE8 或 IE9 或行为不当的代理,您可能看不到客户端 webSocket 支持。

没有其他条件(除了缺乏支持)"knock"连接到轮询。


您可以暂时通过轮询测试您的应用程序,方法是在从客户端连接时仅传入 xhr-polling 传输选项,告诉客户端这是唯一允许的传输选项。


请记住,如果双方都同意,所有 webSocket 连接都以 HTTP 请求开始,然后 "upgraded" 到 webSocket 协议,因此如果您正在浏览器中查看网络跟踪,您应该会看到每个 webSocket 连接都以 HTTP 请求开始——这是正常的。而且,在最新版本的 socket.io 中,它实际上可能会在成功尝试并切换到实际的 webSocket 之前与轮询传输交换一些数据包。