在实时应用程序的开发过程中,服务器推送技术被广泛采用以实现与客户端的实时通信。这三种技术中,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 的简单示例,将随机数流式传输到客户端:
const eventSource = new EventSource('/stream'); eventSource.onmessage = (event) => { console.log(event.data); }
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