如果不需要回退,使用 WebSocket API 代替 Socket.io 有啥好处吗

Posted

技术标签:

【中文标题】如果不需要回退,使用 WebSocket API 代替 Socket.io 有啥好处吗【英文标题】:Is there any advantage of using WebSocket API instead of Socket.io if fallback is not needed如果不需要回退,使用 WebSocket API 代替 Socket.io 有什么好处吗 【发布时间】:2014-06-29 05:14:37 【问题描述】:

我对 socket.io 有一些经验,我之前使用它的主要原因是在旧浏览器中进行后备。目前我必须使用 websockets 开发一个应用程序,它具有特定的浏览器要求。当我检查websocket support 的浏览器矩阵时,我发现我需要的所有浏览器都支持 websockets。

所以现在我进退两难了。我应该坚持使用 socket.io 还是使用纯 websockets 实现它?当我检查 websocket API 时,我发现它非常简单。我对这个问题和this question sounds similar做了一个小研究,它的主要组成部分是与旧浏览器的兼容性(我不在乎)。

如果兼容性不是问题,那么 socket.io 有什么优势吗?

【问题讨论】:

老实说,我开始认为 socket.io 和 SockJS 今天大多是不必要的。第一:不支持 websocket 的浏览器正在迅速消失。第二:重连、广播等,很容易实现。最后一点是“网络套接字流量会被防火墙和代理阻止”,我真的很想更清楚地理解这一点。到目前为止,我已经阅读了很多文章,但没有一个令人信服;他们忽略了这个问题,并假设一定是这种情况,但没有给出明确的证据或解释。 @Marius socket.io 只是一个让您的生活更轻松的包装器。当然你可以自己实现它的所有功能,但是为什么呢? :) 它已经为你完成了。顺便说一句,最近 socket.io started to support peer-to-peer connection 通过 WebRTC(虽然我还没有尝试过) @Curious 我想知道 socket.io 的功能是否必要。如果我不需要它,我宁愿不使用它。在我看来,纯粹的 websockets 应该在今天无处不在。 (有些担心它们不适用于某些代理,但这是针对不支持代理的非浏览器客户端:here) 只是一个用例的想法:如果您传输二进制数据,则使用 Websocket API 直接访问更为优越,因为您可以避免 Base64 编码会使传输的数据膨胀。此外,Socket.io 是一个很棒的包装器,但它也充满了你不需要后备的东西......所以你可以享受更轻的代码库。 【参考方案1】:

是的,有。即使在为新浏览器开发时,我也能看到使用 Socket.IO 的 3 个优势:

首先,有防火墙(见下面的cmets)、防病毒软件和阻止WebSockets的代理。在这种情况下,XHR 回退对于确保您的服务对所有用户的可用性非常有用。

其次,Socket.IO支持自动重连,不用担心临时网络故障。

第三,还有rooms and namespaces 支持,这使得编写实时应用程序变得更加容易和愉快。

【讨论】:

嗨@Curious,第一点真的是真的吗?我想知道防火墙如何阻止 websocket。你说的是端口阻塞吗?或者您是在谈论语义阻塞的可能性,防火墙打开数据包并禁止 WS 数据包?在我看来,它必须是后者(显式语义阻塞),因为您可以(并且可能应该)在 HTTP 端口(80、443)上使用 websocket。 @Marius 看起来你是对的。我刚刚在谷歌上搜索了这个问题,并了解到没有阻止 websockets 的特定规则,因为它们使用与主应用程序相同的端口(正如你提到的)。 Here is 阐明这一点的资源之一。好点马吕斯!

以上是关于如果不需要回退,使用 WebSocket API 代替 Socket.io 有啥好处吗的主要内容,如果未能解决你的问题,请参考以下文章

启用 Spring Security CSRF 的 Sockjs 回退

通过 Gmail API 发送带有纯文本回退的 HTML 电子邮件

(ASK) 我们如何使用 AWS api 网关调试本地 websocket

JavaEE 7 新特性之WebSocket

在Angular中使用websocket发布api调用不起作用

使用 C# .Net 从 WebSocket 抓取数据