2012-11-07 27 views
9

最近我发现Server-Sent事件是从服务器进行推送的更简单的WebSockets替代方法。大多数比较它们的地方(如here,herehere)都表示,如果你不需要客户端和服务器之间的全双工通信,那么WebSocket就是过度杀毒,SSE就足够好了。使用Server-Sent事件进行双向客户端 - 服务器通信(而不是WebSockets)

我的问题是,如果您确实需要双向通信(例如聊天),使用常规Ajax请求从客户端发送消息以及使用服务器流接收它们,那么使用SSE会有什么不利影响?考虑到我不得不在服务器端使用SSE做很少的配置,它似乎是一个更吸引人的选择。

回答

14

SSE 优势过的WebSockets:

  • 不需要特殊的Web服务器或Web代理服务器的变更。
  • 定义自定义事件(否则,客户端API基本相同)
  • 更容易集成现有的认证机制(OAuth的,OpenID的等)

SSE 缺点相比的WebSockets:

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

参考文献:

+2

好点,但我不太同意独立服务器的复杂性。 SSE协议非常简单 - 比WebSockets更简单(无握手,成帧,屏蔽,二进制)。在这两种情况下,您都需要解析HTTP(类似)标头。你可以在bash脚本中实现SSE服务器:) – Kornel

+0

@porneL,你是对的,一个基本的SSE服务器可以相当简单的实现(尽管我想看看你的bash版本),但基本的WebSocket服务器也是如此。但无论如何,我的观点并不是WebSocket服务器更简单,但SSE通常采用Web服务器,而WebSocket则不采用这种服务器(尽管它的设计目的是与现有Web基础架构轻松集成)。 – kanaka

2

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

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

+0

对于双向通讯,能够缓存AJAX请求是不会有帮助。如果您使用AJAX异步加载图像或其他静态数据,那么缓存将是有益的,但是这对于服务器 - >客户端通信是有利的,并且对客户端 - >服务器无帮助,而这正是AJAX在此场景中的用途。 – kanaka

相关问题