WebSockets和Server-Sent Events都能够将数据推送到浏览器。对我来说,他们似乎是竞争技术。他们之间有什么区别?你什么时候选择一个?
答案 0 :(得分:825)
Websockets和SSE(服务器发送事件)都能够将数据推送到浏览器,但它们不是竞争技术。
Websockets连接既可以将数据发送到浏览器,也可以从浏览器接收数据。可以使用websockets的应用程序的一个很好的例子是聊天应用程序。
SSE连接只能将数据推送到浏览器。在线股票报价或更新时间轴或订阅源的twitters是可以从SSE中受益的应用程序的良好示例。
在实践中,由于SSE可以完成的所有工作也可以通过Websockets完成,因此Websockets受到越来越多的关注和喜爱,并且更多的浏览器支持Websockets而不是SSE。
但是,对于某些类型的应用程序来说,它可能过度,而后端可能更容易使用SSE等协议实现。
此外,SSE可以填充到较旧的浏览器中,只使用JavaScript本身不支持它。可以在Modernizr github page上找到SSE polyfill的一些实现。
<强>陷阱:强>
HTML5Rocks有一些关于SSE的好信息。从该页面:
服务器发送事件与WebSockets
为什么要通过WebSockets选择Server-Sent Events?好问题。
SSE一直处于阴影中的一个原因是,后来的WebSockets等API提供了更丰富的协议来执行双向全双工通信。拥有双向渠道对于游戏,消息应用程序以及需要双向近实时更新的情况更具吸引力。但是,在某些情况下,不需要从客户端发送数据。您只需要从某些服务器操作进行更新。一些示例将是朋友的状态更新,股票行情,新闻馈送或其他自动数据推送机制(例如,更新客户端Web SQL数据库或IndexedDB对象存储)。如果您需要将数据发送到服务器,XMLHttpRequest始终是朋友。
SSE通过传统HTTP发送。这意味着他们不需要特殊的协议或服务器实现来实现工作。另一方面,WebSockets需要全双工连接和新的Web Socket服务器来处理协议。此外,Server-Sent Events具有WebSockets设计缺乏的各种功能,例如自动重新连接,事件ID以及发送任意事件的能力。
SSE优于Websockets的优势:
Websockets优于SSE的优势:
SSE的理想用例:
SSE陷阱:
答案 1 :(得分:98)
根据caniuse.com:
您可以使用仅客户端的polyfill将SSE的支持扩展到许多其他浏览器。使用WebSockets的可能性较小。一些EventSource polyfills:
如果您需要支持所有浏览器,请考虑使用支持多种传输的web-socket-js,SignalR或socket.io等库,例如WebSockets,SSE,Forever Frame和AJAX长轮询。这些通常也需要修改服务器端。
了解更多有关SSE的信息:
从以下网址了解有关WebSockets的更多信息:
其他差异:
答案 2 :(得分:15)
Opera,Chrome,Safari支持SSE, Chrome,Safari支持SharedWorker内部的SSE Firefox支持XMLHttpRequest readyState交互,因此我们可以为Firefox创建EventSource polyfil
答案 3 :(得分:6)
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)
答案 6 :(得分:1)
它们在语义上是不同的。
websocket 具有“双向数据流”的原生语义。
而 sse 具有“发布-订阅模式”的原生语义。
当然你可以自己在websocket上实现一层“发布-订阅模式”。但这不太优雅,效率也较低。
在优雅的程序中,实现应该与语义相对应。
答案 7 :(得分:-4)
最大连接限制不是http2 + sse的问题。
这是http 1的问题