使用Server-Sent事件进行双向客户端 - 服务器通信(而不是WebSockets)的缺点

Fac*_*ano 13 real-time server-push websocket server-sent-events

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

我的问题是当你需要双向通信(例如聊天),使用常规的ajax请求从客户端发送消息和服务器流接收它们时,使用SSE的缺点是什么?考虑到我必须在服务器端做很少甚至没有配置来使用SSE,它似乎是一个更吸引人的选择.

kan*_*aka 21

SSE 在WebSockets上的优势:

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

SSE 与WebSockets相比的缺点:

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

参考文献:

  • 好点,但我不太同意独立服务器的复杂性.SSE协议很简单 - 比WebSockets简单得多(没有握手,成帧,屏蔽,二进制).在这两种情况下,您都需要解析HTTP(类似)标头.您可以在bash脚本中实现SSE服务器:) (2认同)