20

最近,我发现 Server-Sent 事件作为 WebSockets 的一种更简单的替代方案,用于从服务器进行推送。大多数比较它们的地方(如这里这里这里)都说,如果您不需要客户端和服务器之间的全双工通信,那么 WebSockets 就过分了,而 SSE 就足够了。

我的问题是当您确实需要双向通信(例如聊天)时使用 SSE 的缺点是什么,使用常规 ajax 请求从客户端发送消息并使用服务器流接收它们?考虑到我几乎不需要在服务器端进行任何配置即可使用 SSE,这似乎是一个更具吸引力的选择。

4

2 回答 2

28

SSE相对于 WebSockets 的优势:

  • 无需特殊的 Web 服务器或 Web 代理更改。
  • 定义自定义事件(否则客户端API基本相同)
  • 更容易集成现有的身份验证机制(OAuth、OpenID 等)

与 WebSockets 相比,SSE的缺点:

  • 单向通信通道(服务器到客户端)。客户端到服务器需要一个单独的通道。
  • 浏览器支持更有限(不支持原生 IE,而 IE 10 支持 WebSockets):WebSocketsSSE
  • 依赖客户端验证来源(可能比 WebSocket 更容易受到 XSS 攻击)
  • 不支持二进制类型(WebSockets 支持使用 ArrayBuffers 和 Blobs 的原始帧)。
  • 即使 SSE 端点不提供静态 Web 内容,也需要一个成熟的 Web 服务器(独立的 WebSocket 服务器可能相当简单)
  • 与使用 WebSocket 连接相比,使用 AJAX 进行双向通信的 SSE 将具有更高的往返延迟和更高的客户端->服务器带宽。这是由于每个客户端->服务器 AJAX 请求的连接设置开销。此外,服务器->客户端延迟可能会在 SSE 中出现峰值,因为在许多配置中,长期保持的连接最终将关闭(通常每 30 秒一次)并且需要重新打开,从而导致服务器->客户端延迟的临时峰值.

参考:

于 2012-11-08T13:16:07.830 回答
3

与小的 WebSocket 消息相比,Ajax 请求是巨大的。标准 HTTP 请求 (Ajax) 包含大量标头,包括每个请求的 cookie,而 WebSocket 消息只有几个字节。

HTTP (Ajax) 请求的好处是,如果这对您的问题有益,那么它们更容易缓存。

于 2012-11-07T21:40:35.247 回答