WebSockets和Server-Sent Events都可以向浏览器推送数据。在我看来,它们似乎是竞争技术。它们之间的区别是什么?什么时候你会选择其中一个?
nimxete21#
Websockets和SSE(服务器发送事件)都能够将数据推送到浏览器,但它们不是竞争技术。Websockets连接既可以向浏览器发送数据,也可以从浏览器接收数据。一个可以使用Websockets的应用程序的很好的例子是聊天应用程序。SSE连接只能将数据推送到浏览器。在线股票报价,或更新时间线或提要的twitter都是可以从SSE中受益的应用程序的很好例子。在实践中,由于可以用SSE完成的所有事情也可以用Websockets完成,因此Websockets得到了更多的关注和喜爱,而且支持Websockets的浏览器比SSE多得多。但是,对于某些类型的应用程序来说,它可能有些过头了,而后端可能更容易使用SSE之类的协议来实现。此外,SSE可以使用JavaScript在不支持它的旧浏览器中进行多边形填充。一些SSE多边形填充的实现可以在Modernizr github page上找到。
缺点:
www.example1.com
www.example2.com
HTML5Rocks提供了一些关于SSE的有用信息。在该页面中:
为什么您会选择服务器发送事件而不是WebSockets?问得好。SSE一直处于阴影之下的一个原因是,像WebSockets这样的后期API提供了更丰富的协议来执行双向全双工通信。对于游戏、消息应用程序以及需要在两个方向上进行近乎实时更新的情况,拥有双向通道更有吸引力。然而,在某些情况下,数据并不需要从客户端发送,您只需要从服务器的某些操作中获取更新,例如朋友的状态更新、股票行情、新闻提要或者其他自动化的数据推送机制(例如更新客户端的WebSQL数据库或IndexedDB对象存储)。SSE通过传统的HTTP发送。这意味着它们不需要特殊的协议或服务器实现来工作。另一方面,WebSocket需要全双工连接和新的Web Socket服务器来处理该协议。此外,服务器发送的事件具有WebSocket在设计上所缺乏的各种功能,如自动重新连接、事件ID和发送任意事件的能力。
SSE相对于Web套接字的优势:
mpbci0fu2#
根据caniuse.com:
您可以使用仅限客户端的polyfill将SSE的支持扩展到许多其他浏览器。WebSockets不太可能这样做。一些EventSource polyfill:
如果你需要支持所有的浏览器,可以考虑使用web-socket-js,SignalR或socket.io这样的库,它们支持多种传输协议,如WebSockets,SSE,Forever Frame和 AJAX 长轮询。要了解有关SSE的更多信息,请访问:
要了解有关WebSockets的更多信息,请访问:
其他差异:
neekobn83#
socket.io
Example - Online chat application.
中 的 每 一 个
EventSource
Example - Online stock quotes or cricket score website.
格式
nwnhqdif4#
Opera、Chrome、Safari支持SSE、Chrome、Safari在SharedWorker内部支持SSE Firefox支持XMLHttpRequest readyState交互式,因此我们可以为Firefox创建事件源聚合文件
chhqkbe15#
需要注意的一点是:我在websockets和企业防火墙方面遇到过问题。(使用HTTPS有帮助,但并不总是如此。)请参阅https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-firewall-softwarehttps://github.com/sockjs/sockjs-client/issues/94我 * 假设 * 服务器发送的事件没有那么多问题,但我不知道。话虽如此,WebSockets是非常有趣的。我有一个使用WebSockets的小网络游戏(通过Socket.IO)(http://minibman.com)
vngu2lb86#
它们在语义上是不同。WebSocket具有“双向数据流”的本机语义含义。而SSE具有“发布-订阅模式”或“请求-响应模式,尽管响应是流”的本机语义含义。当然,您可以自己在WebSocket上实现一层“pub-sub模式”或“req-res模式”。
6条答案
按热度按时间nimxete21#
Websockets和SSE(服务器发送事件)都能够将数据推送到浏览器,但它们不是竞争技术。
Websockets连接既可以向浏览器发送数据,也可以从浏览器接收数据。一个可以使用Websockets的应用程序的很好的例子是聊天应用程序。
SSE连接只能将数据推送到浏览器。在线股票报价,或更新时间线或提要的twitter都是可以从SSE中受益的应用程序的很好例子。
在实践中,由于可以用SSE完成的所有事情也可以用Websockets完成,因此Websockets得到了更多的关注和喜爱,而且支持Websockets的浏览器比SSE多得多。
但是,对于某些类型的应用程序来说,它可能有些过头了,而后端可能更容易使用SSE之类的协议来实现。
此外,SSE可以使用JavaScript在不支持它的旧浏览器中进行多边形填充。一些SSE多边形填充的实现可以在Modernizr github page上找到。
缺点:
www.example1.com
的SSE连接,以及另外6个到www.example2.com
的SSE连接(感谢Phate)。HTML5Rocks提供了一些关于SSE的有用信息。在该页面中:
服务器发送的事件与WebSocket
为什么您会选择服务器发送事件而不是WebSockets?问得好。
SSE一直处于阴影之下的一个原因是,像WebSockets这样的后期API提供了更丰富的协议来执行双向全双工通信。对于游戏、消息应用程序以及需要在两个方向上进行近乎实时更新的情况,拥有双向通道更有吸引力。然而,在某些情况下,数据并不需要从客户端发送,您只需要从服务器的某些操作中获取更新,例如朋友的状态更新、股票行情、新闻提要或者其他自动化的数据推送机制(例如更新客户端的WebSQL数据库或IndexedDB对象存储)。
SSE通过传统的HTTP发送。这意味着它们不需要特殊的协议或服务器实现来工作。另一方面,WebSocket需要全双工连接和新的Web Socket服务器来处理该协议。此外,服务器发送的事件具有WebSocket在设计上所缺乏的各种功能,如自动重新连接、事件ID和发送任意事件的能力。
TLDR摘要:
SSE相对于Web套接字的优势:
Web套接字相对于SSE的优势:
SSE的理想使用情形:
SSE陷阱:
mpbci0fu2#
根据caniuse.com:
您可以使用仅限客户端的polyfill将SSE的支持扩展到许多其他浏览器。WebSockets不太可能这样做。一些EventSource polyfill:
如果你需要支持所有的浏览器,可以考虑使用web-socket-js,SignalR或socket.io这样的库,它们支持多种传输协议,如WebSockets,SSE,Forever Frame和 AJAX 长轮询。
要了解有关SSE的更多信息,请访问:
要了解有关WebSockets的更多信息,请访问:
其他差异:
neekobn83#
# # Web 套接 字 与 SSE
socket.io
。中 的 每 一 个
EventSource
接口 来 接收 服务 器 发送 的 消息 。格式
nwnhqdif4#
Opera、Chrome、Safari支持SSE、Chrome、Safari在SharedWorker内部支持SSE Firefox支持XMLHttpRequest readyState交互式,因此我们可以为Firefox创建事件源聚合文件
chhqkbe15#
需要注意的一点是:
我在websockets和企业防火墙方面遇到过问题。(使用HTTPS有帮助,但并不总是如此。)
请参阅https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-firewall-softwarehttps://github.com/sockjs/sockjs-client/issues/94
我 * 假设 * 服务器发送的事件没有那么多问题,但我不知道。
话虽如此,WebSockets是非常有趣的。我有一个使用WebSockets的小网络游戏(通过Socket.IO)(http://minibman.com)
vngu2lb86#
它们在语义上是不同。
WebSocket具有“双向数据流”的本机语义含义。
而SSE具有“发布-订阅模式”或“请求-响应模式,尽管响应是流”的本机语义含义。
当然,您可以自己在WebSocket上实现一层“pub-sub模式”或“req-res模式”。