WebSockets与服务器发送的事件/事件源

时间:2011-03-04 15:07:32

标签: html5 websocket server-sent-events

WebSocketsServer-Sent Events都能够将数据推送到浏览器。对我来说,他们似乎是竞争技术。他们之间有什么区别?你什么时候选择一个?

8 个答案:

答案 0 :(得分:825)

Websockets和SSE(服务器发送事件)都能够将数据推送到浏览器,但它们不是竞争技术。

Websockets连接既可以将数据发送到浏览器,也可以从浏览器接收数据。可以使用websockets的应用程序的一个很好的例子是聊天应用程序。

SSE连接只能将数据推送到浏览器。在线股票报价或更新时间轴或订阅源的twitters是可以从SSE中受益的应用程序的良好示例。

在实践中,由于SSE可以完成的所有工作也可以通过Websockets完成,因此Websockets受到越来越多的关注和喜爱,并且更多的浏览器支持Websockets而不是SSE。

但是,对于某些类型的应用程序来说,它可能过度,而后端可能更容易使用SSE等协议实现。

此外,SSE可以填充到较旧的浏览器中,只使用JavaScript本身不支持它。可以在Modernizr github page上找到SSE polyfill的一些实现。

<强>陷阱:

  • SSE受到最大打开连接数的限制,打开各种标签时可能会特别痛苦,因为限制为每个浏览器并设置为非常低的数字(6)。该问题已在ChromeFirefox
  • 中标记为“无法修复”
  • 只有WS可以传输二进制数据和UTF-8,SSE仅限于UTF-8。 (感谢Chado Nihi)。

HTML5Rocks有一些关于SSE的好信息。从该页面:

  

服务器发送事件与WebSockets

     

为什么要通过WebSockets选择Server-Sent Events?好问题。

     

SSE一直处于阴影中的一个原因是,后来的WebSockets等API提供了更丰富的协议来执行双向全双工通信。拥有双向渠道对于游戏,消息应用程序以及需要双向近实时更新的情况更具吸引力。但是,在某些情况下,不需要从客户端发送数据。您只需要从某些服务器操作进行更新。一些示例将是朋友的状态更新,股票行情,新闻馈送或其他自动数据推送机制(例如,更新客户端Web SQL数据库或IndexedDB对象存储)。如果您需要将数据发送到服务器,XMLHttpRequest始终是朋友。

     

SSE通过传统HTTP发送。这意味着他们不需要特殊的协议或服务器实现来实现工作。另一方面,WebSockets需要全双工连接和新的Web Socket服务器来处理协议。此外,Server-Sent Events具有WebSockets设计缺乏的各种功能,例如自动重新连接,事件ID以及发送任意事件的能力。


TLDR摘要:

SSE优于Websockets的优势:

  • 通过简单HTTP而非自定义协议传输
  • 可以使用javascript进行填充,以便将SSE“后退”到尚不支持它的浏览器。
  • 内置支持重新连接和event-id
  • 更简单的协议

Websockets优于SSE的优势:

  • 实时,双向通信。
  • 更多浏览器中的原生支持

SSE的理想用例:

  • 股票报价流
  • twitter feed updates
  • 浏览器通知

SSE陷阱:

  • 没有二进制支持
  • 最大开放连接限制

答案 1 :(得分:98)

根据caniuse.com:

您可以使用仅客户端的polyfill将SSE的支持扩展到许多其他浏览器。使用WebSockets的可能性较小。一些EventSource polyfills:

如果您需要支持所有浏览器,请考虑使用支持多种传输的web-socket-jsSignalRsocket.io等库,例如WebSockets,SSE,Forever Frame和AJAX长轮询。这些通常也需要修改服务器端。

了解更多有关SSE的信息:

从以下网址了解有关WebSockets的更多信息:

其他差异:

  • WebSockets支持任意二进制数据,SSE仅使用UTF-8

答案 2 :(得分:15)

Opera,Chrome,Safari支持SSE, Chrome,Safari支持SharedWorker内部的SSE Firefox支持XMLHttpRequest readyState交互,因此我们可以为Firefox创建EventSource polyfil

答案 3 :(得分:6)

Websocket VS SSE

Web套接字 - 这是一种通过单个TCP连接提供全双工通信通道的协议。     例如,服务器和浏览器之间的双向通信 由于协议更复杂,服务器和浏览器必须依赖websocket库 这是socket.io

Example - Online chat application.

SSE(服务器发送事件) - 在服务器发送事件的情况下,通信仅从服务器到浏览器执行,并且浏览器不能向服务器发送任何数据。主要使用这种通信 当需要只显示更新的数据时,服务器会在数据更新时发送消息。     例如,服务器到浏览器之间的单向通信。 这个协议不那么复杂,所以不需要依赖外部库JAVASCRIPT本身提供EventSource接口来接收服务器发送的消息。

Example - Online stock quotes or cricket score website.

答案 4 :(得分:3)

有一点需要注意:
我遇到了websockets和企业防火墙的问题。 (使用HTTPS有帮助但并非总是如此。)

参见https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-firewall-software https://github.com/sockjs/sockjs-client/issues/94

假设没有与服务器发送事件一样多的问题。但我不知道。

也就是说,WebSockets很有趣。我有一个使用websockets的小型网页游戏(通过Socket.IO)(http://minibman.com

答案 5 :(得分:1)

Here是关于Web套接字和服务器发送事件之间差异的讨论。从Java EE 7开始,WebSocket API已经成为规范的一部分,似乎服务器发送的事件将在企业版的next版本中发布。

答案 6 :(得分:1)

它们在语义上是不同的。

websocket 具有“双向数据流”的原生语义。

而 sse 具有“发布-订阅模式”的原生语义。

当然你可以自己在websocket上实现一层“发布-订阅模式”。但这不太优雅,效率也较低。

在优雅的程序中,实现应该与语义相对应。

答案 7 :(得分:-4)

最大连接限制不是http2 + sse的问题。

这是http 1的问题