Server-sent Events vs WebSockets vs Long Polling:哪一个更适合实时应用?

阅读时长 6 分钟读完

在实时应用程序的开发过程中,服务器推送技术被广泛采用以实现与客户端的实时通信。这三种技术中,Server-sent Events (SSE)、WebSockets、Long-Polling 都可以实现服务器到客户端的实时消息传递,但是它们在每个应用程序上都有自己的优点和缺点。在本文中,我们将深入分析这三种技术的特点,以及哪一种适合你的实时应用程序需求。

Server-sent Events

Server-sent Events (SSE) 是 HTML5 规范的一部分,它允许服务器以单向方式向客户端发送事件。 SSE 提供了一个类似于 WebSockets 的 API,但它只能在服务器和客户端之间建立单一连接,并始终使用 HTTP/HTTPS 协议进行通信。因为 SSE 是单向打开连接的,客户端不能向服务器发送消息。

优点

  • SSE 适用于那些实时性要求不高,且需要从服务器获取事件流数据的应用程序。由于 SSE 基于 HTTP,所以它可以轻松地在服务器和客户端之间运行,并且不需要重新配置防火墙。
  • SSE 在建立连接、发送消息和关闭连接时的编写复杂度较小。相比于 WebSockets,SSE 的 API 也少得多。

缺点

  • SSE 是基于 HTTP 协议的,随着数据流的增加,连接之间的信息传输将显得不太高效。并且,每次数据流更新都会导致新的 HTTP 请求和响应,因此在客户端和服务器之间的流量和数据处理上有一定的开销。
  • SSE 与浏览器和服务器之间的连接可能会随着时间的推移变得不稳定,并且可能会导致连接中断或超时。由于 SSE 只支持单向连接,因此当连接断开时,客户端必须重新连接以重新开始事件流的接收。

代码示例

以下是一个使用 SSE 的简单示例,将随机数流式传输到客户端:

WebSockets

WebSockets 是双向半双工通信协议,它通过单个 TCP 连接提供了全双工通信。WebSockets 的 API 与 SSE 相比更为强大,因为它提供了双向通信的机制。

优点

  • 与 SSE 相比,WebSockets 的性能更好,因为它只有在连接建立时会进行一次握手,之后的所有通信都使用二进制协议。这导致了很少的开销。
  • WebSockets 提供了双向通信功能,因此客户端和服务器之间可以在同一时间内发送和接收消息。这使得 WebSockets 对于要求与服务器进行双向通信的应用程序非常有用。
  • WebSockets API 允许您设置回调函数以侦听连接的事件,如连接打开、错误、关闭等。

缺点

  • WebSockets 通常需要您使用不同的固定端口(默认为 80 或 443。),这意味着您可能需要重新配置您的防火墙以允许 WebSockets 流量。如果您使用的是 SSL/TLS,则需要单独配置 SSL/TLS 加密的 WebSockets 流量。
  • 因为 WebSockets 已经成为主流技术,所以攻击者可以使用 WebSocket 协议的各种漏洞进行攻击。这意味着您需要更仔细地检查和防范可能的安全威胁。

代码示例

这是一个使用 WebSockets 的简单聊天程序示例:

client.html:

-- -------------------- ---- -------
----- ------ - --- ---------------------------------
---------------- - ------- -- -
  -------------------------
-
--------------------------------------------------------------- --- -- -
  --------------------
  ----------------------------------------------------------
  -------------------------------------------- - ---
---
展开代码

server.js:

-- -------------------- ---- -------
----- --------- - --------------
----- --- - --- ------------------ ----- ---- ---
-------------------- ---- -- -
  ----------------- --------- -- -
    ----------------------------- -- -
      ---- ------------------ --- --------------- -
        -----------------------
      ---
    ----
  ----
---
展开代码

Long Polling

Long Polling 是与 SSE 相似的轮询技术。Long Polling 通过设置一个长连接,使得客户端可以一直保持等待,直到服务器有数据要返回给它,然后将完整的数据一次性发送给客户端。

优点

  • Long Polling 是一种使用成熟的技术,已过时,所以使用 Long Polling 构建的应用程序的兼容性非常好。
  • 对于某些应用程序(如小规模聊天应用程序),Long Polling 可以比 WebSockets 更好地实现,因为它可以减少网络流量。

缺点

  • Long Polling 会导致服务器负载的增加,因为对于每个连接,它都需要维护长连接,并在消息到达时立即响应客户端。
  • 等待超时:如果客户端在等待过程中断开连接或关闭了浏览器选项卡,那么与此连接相关的所有资源都将从服务器中删除。这可能会导致服务器负载的过多,因为它需要维护大量的连接。

代码示例

以下是一个使用 Long Polling 的简单示例:

-- -------------------- ---- -------
-------- ---------- -
  ---- --- - --- -----------------
  ---------------- -------------- ------
  ----------------------- - ---------- -
    --- --------------- --- ------------------- -- ---------- --- ---- -
      --------------------------------
      -------------
    --
  --
  ------------
-
-----------
展开代码

哪一种适合您的实时应用程序需求?

当您需要实现双向通信时,请使用 WebSockets。如果您想要在与客户端进行双向通信时降低服务器负载,请使用 SSE。对于小型聊天应用程序,请使用 Long Polling。

总之,每种技术都有适用范围和适用情况,要根据具体需求选择适当的技术。同时,我们也应该遵循最佳实践并且加强安全保障来避免各种攻击和漏洞。

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

纠错
反馈

纠错反馈