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

Posted

技术标签:

【中文标题】socket.io 啥时候使用轮询而不是 websockets?【英文标题】:When does socket.io use polling instead of websockets?socket.io 什么时候使用轮询而不是 websockets? 【发布时间】:2015-09-04 20:11:54 【问题描述】:

我对 socket.io 还很陌生,并且在 node/express/socket.io 中编写了我的第一个应用程序。现在一切都在我的 nginx 服务器上运行良好。我想向公众发布我的应用程序,但我担心它对很多人不起作用。我有几个朋友测试了我的应用程序,一切都很顺利(这是一个非常简单的应用程序)。这是我的担忧:现在每个连接似乎都在使用 websockets,这正是我想要的。但是我的应用程序有时会因为客户端出现奇怪的事情而降级为“轮询”吗?如果是这样,socket.io 如何决定何时使用轮询以及何时使用 websocket(是基于浏览器/版本或连接还是什么)?我很确定它会在可能的情况下使用 websocket,但是是否有一个条件列表可以将其击倒为“轮询”?另外,有没有一种方法可以让我使用“轮询”来测试我的应用程序是否有效?

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

【问题讨论】:

【参考方案1】:

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

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

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

没有其他条件(除了缺乏支持)会将连接“中断”到轮询。


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


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

【讨论】:

您好,只是强调@jfriend00 提出的一点:在socket.io 1.0+ 中,默认情况下连接总是以多个HTTP“轮询”请求开始,尽管您可以按照here 的描述跳过这些。

以上是关于socket.io 啥时候使用轮询而不是 websockets?的主要内容,如果未能解决你的问题,请参考以下文章

Flask-SocketIO 服务器使用轮询而不是 websockets

使用轮询而不是websockets的Flask-SocketIO服务器

为啥我要使用 RxJS 的 interval() 或 timer() 轮询而不是 window.setInterval()?

当远程但不是本地时,Socket.io 退回到 nginx 代理后面的轮询(websocket 给出 400)

如何使用 socket.io 实现长轮询?

socket.io 不断尝试在错误的地址上使用轮询