2

Socket.IO 与 WebSocket:主要区别和使用方法

 1 year ago
source link: https://blog.p2hp.com/archives/10826
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

这篇博文比较了 Socket.IO 和 WebSocket,这两个最流行的选项可用于构建实时功能,例如聊天、多人游戏或多用户文档协作。我们将看看以下内容:

  • WebSocket简介

  • Socket.IO简介

  • WebSocket:优点和缺点

  • Socket.IO:优点和缺点

  • Socket.IO 和 WebSocket 用例

  • Socket.IO 和 WebSocket 之间有什么区别?

  • 什么时候应该使用 Socket.IO 什么时候应该使用 WebSocket?

  • Socket.IO 和 WebSocket 替代品

WebSocket简介

WebSocket是一种实时技术,可通过持久的单套接字连接在客户端和服务器之间实现双向、全双工通信。

WebSocket 连接以 HTTP 请求/响应握手开始。如果此初始握手成功,则客户端和服务器已同意使用为 HTTP 请求建立的现有 TCP 连接作为 WebSocket 连接。只要需要,这个连接就会一直保持活动状态(理论上,它可以永远持续下去),允许服务器和客户端独立地随意发送数据。

websockets.png?w=745&h=724&q=50&fm=png

WebSocket 技术包括两个核心构建块:

  • WebSocket 协议。WebSocket 协议于 2011 年 12 月通过 RFC 6455 标准化,支持通过 Web 在 WebSocket 客户端和 WebSocket 服务器之间进行实时通信。它支持二进制数据和文本字符串的传输。

  • WebSocket API。允许您执行必要的操作,例如管理 WebSocket 连接、发送和接收消息以及侦听 WebSocket 服务器触发的事件。几乎所有现代浏览器都支持 WebSocket API。

Socket.IO简介

Socket.IO是一个实时库,可实现 Web 客户端和服务器之间的低延迟双向通信。Socket.IO 建立在 WebSocket 协议之上,并提供额外的功能,例如自动重新连接、广播支持或回退到HTTP 长轮询。

0_Ycp0d6CqDMIGWBrY.png?w=811&h=290&q=50&fm=png

请注意,Socket.IO 在底层使用Engine.IO来建立低级连接并在客户端和服务器之间交换数据。

长期以来,Socket.IO 官方只提供了一个 Node.js 服务器实现,以及一个 JavaScript 客户端。最近,Socket.IO 的创建者还用 Java、C++ 和 Swift 开发了其他几个客户端。 

除了官方支持的实现之外,还有多个其他 Socket.IO 客户端和服务器实现,由社区维护,涵盖编程语言和平台,如 Python、Golang 或 .NET。 

WebSocket:优点和缺点

WebSocket 优势

  • 在 WebSocket 出现之前,AJAX 长轮询和 Comet 等 HTTP 技术是构建实时应用程序的标准。与 HTTP 相比,WebSocket无需为每个请求建立新连接,从而大大减少了每条消息的大小(无 HTTP 标头)。与 HTTP 相比,这有助于节省带宽、改善延迟并减少服务器端的 WebSockets 负担。

  • 灵活性根植于 WebSocket 技术的设计中,它允许实施应用程序级协议和附加功能的扩展(例如发布/订阅消息传递)。

  • 作为一种事件驱动技术,WebSocket 允许在没有客户端请求的情况下传输数据。在客户端需要对事件(尤其是它无法预测的事件,例如欺诈警报)做出快速反应的情况下,此特性是可取的。

WebSocket 缺点

  • 与 HTTP 不同,WebSocket 是有状态的。这可能很难处理,尤其是在规模上,因为它需要服务器层跟踪每个单独的 WebSocket 连接并维护状态信息。

  • WebSockets 不会在连接终止时自动恢复——这是您需要自己实现的东西,也是存在许多 WebSocket 客户端库的部分原因。

  • 某些环境(例如带有代理服务器的公司网络)会阻止 WebSocket 连接,而某些浏览器仍然不支持 WebSocket。

Socket.IO:优点和缺点

Socket.IO 优势

  • Socket.io 支持通过命名空间进行多路复用。使用命名空间使您能够最大限度地减少使用的 TCP 连接数,并节省服务器上的套接字端口。 

  • Socket.IO 允许服务器端灵活地向所有连接的客户端广播事件。您还可以通过房间功能向部分客户广播事件。

  • Socket.IO 提供HTTP 长轮询作为后备选项,这在不支持 WebSockets 的环境中很有用。

  • Socket.IO 提供了一种可配置的 Ping/Pong 心跳机制,允许您检测连接是否存在。此外,如果客户端断开连接,它会自动重新连接。

Socket.IO 缺点

  • Socket.IO 不保证 exactly-once 消息语义。默认情况下,提供至多一次保证。Socket.IO 也可以配置为提供至少一次保证,尽管这会带来额外的工程复杂性——您必须使用确认、超时、为每个事件分配唯一 ID 并将事件保存在数据库中。 

  • Socket.IO 具有有限的本机安全功能。例如,它不提供端到端加密,也不提供生成和更新令牌以进行身份​​验证的机制。

  • Socket.IO 与任何其他 WebSocket 实现都不兼容。例如,您不能将普通的 WebSocket 客户端与 Socket.IO 服务器一起使用;Socket.IO 客户端也无法连接到普通的 WebSocket 服务器。

  • Socket.IO 被设计为在单个区域中工作,而不是在多区域架构中工作。这可能会导致延迟增加(如果您的用户位于不同区域),甚至系统停机等问题 - 如果您拥有 Socket.IO 服务器的数据中心发生中断会怎样?

Socket.IO 和 WebSocket 用例

作为类似的技术,Socket.IO 和 WebSocket 都可以用于为最终用户提供实时功能。我们可以将 WebSocket 和 Socket.IO 用例大致分为两类:

  • 实时更新,其中通信是单向的,并且服务器正在将低延迟(并且通常是频繁的)更新流式传输到客户端。想想实时体育更新、警报、实时仪表板或实时位置跟踪。

  • 双向通信,客户端和服务器都发送和接收消息。示例包括聊天应用程序、虚拟事件和虚拟教室(后两者通常涉及投票、测验和问答等功能)。WebSocket 和 Socket.IO 还可用于支持多用户同步协作功能,例如多人同时编辑同一文档。

Socket.IO 与 WebSocket:有什么区别?

WebSocket 是一种在客户端和服务器之间实现双向实时通信的技术。相比之下,Socket.IO 是一个在 WebSockets 之上提供抽象层的库,可以更轻松地创建实时应用程序。

似乎WebSockets 在性能方面比 Socket.IO 有优势;例如,与 Socket.IO 相比,WebSockets 的内存需求要低得多。然而,一些差异是可以预料的。毕竟,Socket.IO 是比原始 WebSocket 更复杂(要求更高)的解决方案。

Socket.IO 提供自动重新连接、房间和回退到长轮询等功能。使用 vanilla WebSockets,您无法从这些开箱即用的功能中受益;如果它们与您的用例相关,您必须自己构建所有这些功能。

我应该使用 Socket.IO 还是 WebSocket?

您应该使用 Socket.IO 还是 WebSocket 取决于几个因素。首先,您的用例的细节。例如,原始 WebSocket 适用于简单的用例,例如向(大多数)浏览器发送数据。另一方面,对于更复杂的用例,例如聊天应用程序,Socket.IO 是一个更好的选择,因为它允许您比普通的 WebSockets 更快地移动。

要记住的另一个方面是您的用例所需的灵活性程度。原始 WebSockets 提供了更大的灵活性——您可以设计自己的架构和顶层协议(尽管这非常困难且耗时)。相比之下,Socket.IO 带有预先设计的架构和协议,在某些时候可能会受到限制。

无论您选择哪种方式(WebSocket 或 Socket.IO),构建可靠的实时功能并将其大规模交付给最终用户绝非易事。

Socket.IO 和 WebSocket 替代品

我们希望本文能帮助您更好地理解 Socket.IO 和 WebSockets 之间的优缺点和差异。值得注意的是,Socket.IO 和 WebSocket 并不是您可以用来构建实时功能的唯一技术。这里有一些:

如果您想避免在内部管理 WebSocket 基础设施的麻烦和高昂的成本,您可能需要考虑使用完全托管的 WebSocket 解决方案。




About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK