在 Angular 应用中使用 WebSocket 实现消息推送的最佳实践

阅读时长 6 分钟读完

引言

现代 Web 应用的用户体验不能仅仅依赖于用户端与服务器端简单的 HTTP 请求和响应。相反,常常涉及到近实时的数据传输,例如聊天室、在线课堂和实时数据监视等。为实现这些需求,我们需要一种高效、轻量、即时的网络通信协议。

WebSocket 正是为此而生的协议,它提供了真正的双向数据传输,使数据在客户端和服务器之间的交流变得非常容易。本文将介绍 WebSocket 协议的基础知识,并使用 Angular 框架构建一个具有实时数据更新功能的 Web 应用。

WebSocket 协议

WebSocket 协议是一种支持在单个 TCP 连接上进行全双工通信的协议。它通过在客户端和服务器之间建立一个持久连接来实现相互通信,将 HTTP 消息头包装成 WebSocket 消息头。WebSocket 协议与 HTTP 协议兼容,使用标准的 HTTP 端口 80 和 443。

WebSocket 协议的起源还要追溯到 Web 2.0 时代。在那个时代,我们使用 AJAX(Asynchronous JavaScript and XML)技术来实现数据的异步请求和响应,但它依然不能完全满足实时数据传输的需求。要解决这个问题,HTML5 标准中提出了 WebSocket 标准。

WebSocket 几乎完全在后台进行协商,而不涉及应用程序或用户界面。在前端,我们只需要创建 WebSocket 实例,向服务器发出连接请求,然后通过 WebSocket 实例从服务器接收或发送数据即可。

WebSocket 的优点

与传统的 HTTP 协议相比,WebSocket 协议有以下几个优点:

  1. 低延迟:传统的 HTTP 请求和响应需要在每个请求和响应中开关一个 TCP 连接,而 WebSocket 使用一个持久连接,减少了延迟。
  2. 服务器可以主动推送消息给客户端:不需要由客户端来轮询服务器消息。
  3. 二进制支持:通过 WebSocket 协议,可以传递二进制数据,而不只是文本。
  4. 可扩展性:WebSocket 协议可以让客户端和服务器定义自己的协议,以满足需要。

WebSocket 的缺点

WebSocket 协议也有其自身的缺点:

  1. 由于 WebSocket 报文中包含了额外的信息,WebSocket 报文比明文数据要大。这可能会增加网络传输的负担。
  2. Wormhole 攻击:WebSocket 连接可以在网关和负载平衡的后面工作。温和的攻击者可以通过这条路线注入 WebSocket 报文,而受害者无法识别这些报文,这个缺陷可能导致加强或二次注入攻击。

Angular 中使用 WebSocket 的实现

关于 WebSocket 最常见的使用情况是与实时数据更新相关的应用。当服务器端数据更新时,WebSocket 就可以通知客户端数据已经发生改变,则客户端可以实时地将数据更新到 UI 中。

下面是如何在 Angular 中使用 WebSocket 实现此功能:

我们首先需要在 Angular 项目中添加 WebSocket 模块:

WebSocketService 的实现如下:

-- -------------------- ---- -------
------ ------------ ---- ----------------
------ ----------- ----------------- ---- -----------------

-------------
  ----------- ------
--
------ ----- ---------------- -
  ------- -------- ----------------------

  ------------- -
  -

  ------ ---------- --------------------- -
    -- -------------- -- -------------------- -
      ------------ - ---------------------------------
    -
    ------ -------------
  -

  ------ ------------ -
    -- ------------- -- --------------------- -
      ------------------------
    -
  -
-

我们使用 WebSocketSubject 类来管理 WebSocket 连接。在 connect() 中,我们判断当前 WebSocket 连接是否已存在。如果不存在或已关闭,则使用 webSocket() 方法创建一个新的连接。disconnect() 方法则负责关闭已存在且未关闭的连接。

最后,我们需要在组件中调用 WebSocketService。下面是一个页面组件,它用来实时更新从服务器接收到的数据。

-- -------------------- ---- -------
------ ----------- ------- ---- ----------------
------ ------------------ ---- ----------------------
------ -------------- ---- -------

------------
  --------- -----------
  ------------ ------------------------
  ---------- -------------------------
--
------ ----- ------------- ---------- ------ -

  ------ --------- -------- - ---
  ------- ------------- -------------

  ------------------- ---------- ----------------- -
  -

  ---------- -
    ----------------- - -------------------------------------------- -- -
      ----------------------------
    ---
  -

  ------------- -
    -------------------------------
    ---------------------------
  -
-

在组件的 ngOnInit() 生命周期方法中我们调用 WebSocketService.connect()。当 WebSocket 连接成功后,我们将 WebSocketSubject 对象的订阅与消息传递绑定在组件的 Subscription 上,使我们能够在组件销毁时取消订阅以及关闭连接。

总结

WebSocket 协议在现代 Web 应用程序中变得越来越重要,特别是在实时数据传输方面。本文介绍了 WebSocket 协议的基础知识,以及如何在 Angular 项目中使用 WebSocket 实现实时数据更新功能。我们希望本文能够帮助读者理解 WebSocket 协议在 Web 应用程序中的优缺点,并能够在其项目中成功应用。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64aea18e48841e9894ad06db

纠错
反馈