WebSockets vs.服务器发送的事件/事件源

服务器发送的事件都能够将数据推送到浏览器。在我看来,它们似乎是相互竞争的技术。它们之间的区别是什么?什么时候你会选择一个而不是另一个?

291945 次浏览

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

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

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

SSE连接只能向浏览器推送数据。在线股票报价或twitter更新时间轴或提要是可以从SSE获益的应用程序的好例子。

实际上,因为所有可以用SSE完成的事情都可以用Websockets完成,所以Websockets得到了更多的关注和喜爱,而且比SSE支持Websockets的浏览器也更多。

然而,对于某些类型的应用程序来说,它可能太过了,并且使用SSE之类的协议可以更容易地实现后端。

此外,SSE可以被填充到仅使用JavaScript原生不支持它的旧浏览器中。SSE腻子的一些实现可以在Modernizr github页面上找到。

陷阱:

  • SSE受到最大打开连接数的限制,当打开各种选项卡时可能会特别痛苦,因为限制是每一个浏览器,并且设置为非常低的数字(6)。该问题在火狐中被标记为“无法修复”。这个限制是每个浏览器+域,所以这意味着你可以在所有选项卡上打开6个SSE连接到www.example1.com,另外6个SSE连接到www.example2.com(感谢Phate)。
  • 只有WS可以同时传输二进制数据和UTF-8, SSE仅限于UTF-8。(感谢Chado Nihi)。
  • 一些具有包检测功能的企业防火墙在处理WebSockets时会遇到问题(Sophos XG Firewall、WatchGuard、McAfee Web Gateway)。

HTML5Rocks有一些关于SSE的好信息。从那一页开始:

服务器发送事件vs. WebSockets

为什么选择服务器发送事件而不是WebSockets?好问题。

sse一直处于阴影中的一个原因是,后来的api(如WebSockets)提供了更丰富的协议来执行双向、全双工通信。对于游戏、即时通讯应用和需要双向实时更新的应用来说,双向通道更具吸引力。然而,在某些场景中,数据不需要从客户端发送。您只需要从一些服务器操作中更新。一些例子包括朋友的状态更新、股票行情、新闻提要或其他自动数据推送机制(例如更新客户端Web SQL数据库或IndexedDB对象存储)。如果需要向服务器发送数据,XMLHttpRequest总是一个好朋友。

sse通过传统HTTP发送。这意味着它们不需要特殊的协议或服务器实现就可以工作。另一方面,WebSockets需要全双工连接和新的WebSocket服务器来处理协议。此外,服务器发送事件具有WebSockets设计上所缺乏的各种特性,例如自动重连接、事件id和发送任意事件的能力。


TLDR简介:

SSE相对于Websockets的优点:

  • 通过简单的HTTP传输,而不是自定义协议
  • 可以用javascript“反向移植”SSE到还不支持它的浏览器。
  • 内置对重新连接和事件id的支持
  • 简单的协议
  • 企业防火墙做包检查没有问题

Websockets相对于SSE的优点:

  • 实时,双向交流。
  • 更多浏览器的本地支持

SSE的理想用例:

  • 股票行情流
  • 推特更新
  • 浏览器通知

上交所陷阱:

  • 不支持二进制
  • 最大连接数限制

据caniuse.com网站报道:

您可以使用仅客户端的polyfill将SSE支持扩展到许多其他浏览器。这在WebSockets中是不太可能的。一些EventSource腻子:

如果你需要支持所有的浏览器,可以考虑使用web-socket-jsSignalRsocket . io这样的库,它们支持多种传输,如WebSockets、SSE、Forever Frame和AJAX长轮询。这些通常也需要对服务器端进行修改。

了解更多关于SSE的信息:

了解更多关于WebSockets的信息:

其他的差异:

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

有一件事需要注意:
我有websockets和企业防火墙的问题。(使用HTTPS有帮助,但并不总是如此)

参见https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-firewall-software# 0 < / p >

假设服务器发送事件没有那么多问题。但我不知道。

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


Websocket VS SSE


Web Sockets -这是一个协议,它在一个TCP连接上提供了一个全双工通信通道。例如,服务器和浏览器之间的双向通信由于协议比较复杂,服务器和浏览器不得不依赖websocket库socket.io

Example - Online chat application.

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

Example - Online stock quotes or cricket score website.

它们在语义上有所不同。

Websocket的原生语义是“双向数据流”。

sse的原生语义为“发布-订阅模式”;或者“请求-响应模式,尽管响应是一种流”。

当然你可以实现一层“发布-订阅模式”;或者“req-res pattern”;通过websocket自己。