WebSockets与服务器发送的事件/ EventSource
WebSockets和服务器发送事件都能够将数据推送到浏览器。 在我看来,它们似乎是竞争技术。 它们之间有什么区别? 您何时会选择一个?
#1楼
根据caniuse.com:
- 96%的全球用户本机支持WebSockets
- 全球用户中有92%本地支持服务器发送的事件
您可以使用仅客户端的polyfill将对SSE的支持扩展到许多其他浏览器。 WebSockets不太可能这样。 一些EventSource polyfills:
- Remy Sharp的EventSource ,没有其他库依赖项(IE7 +)
- Rick Waldron的jQuery.EventSource
- Yaffle的 EventSource (替换本机实现,跨浏览器规范行为)
如果需要支持所有浏览器,请考虑使用诸如web-socket-js , SignalR或socket.io之类的库,该库支持多种传输方式,例如WebSockets,SSE,Forever Frame和AJAX长轮询。 这些通常也需要修改服务器端。
从以下位置了解有关SSE的更多信息:
- HTML5 Rocks文章
- W3C规范( 已发布的版本 , 编辑的草稿 )
从以下位置了解有关WebSocket的更多信息:
- HTML5 Rocks文章
- W3C规范( 已发布的版本 , 编辑的草稿 )
其他差异:
- WebSockets支持任意二进制数据,SSE仅使用UTF-8
#2楼
需要注意的一件事:
我在使用websocket和公司防火墙时遇到了问题。 (使用HTTPS有帮助,但并非总是如此。)
参见https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-firewall-software https://github.com/sockjs/sockjs-client/issues/94
我认为服务器发送事件没有太多问题。 但是我不知道。
就是说,WebSocket充满乐趣。 我有一个使用websockets的小型网络游戏(通过Socket.IO)( http://minibman.com )
#3楼
这里讨论Web套接字和服务器发送事件之间的区别。 从Java EE 7开始, WebSocket API已成为规范的一部分,并且服务器发送的事件似乎将在企业版的下一版本中发布。
#4楼
Websocket VS SSE
Web套接字-这是一个协议,可通过单个TCP连接提供全双工通信通道。 例如,服务器和浏览器之间的双向通信由于协议更加复杂,因此服务器和浏览器必须依赖于socket.io
的websocket库。
Example - Online chat application.
SSE(服务器发送事件)-如果发生服务器发送事件,则仅在服务器与浏览器之间进行通信,而浏览器无法向服务器发送任何数据。 这种通信主要在只需要显示更新的数据时使用,然后只要数据更新,服务器就会发送消息。 例如,服务器与浏览器之间的单向通信。 该协议不太复杂,因此不需要依赖外部库JAVASCRIPT本身提供了EventSource
接口来接收服务器发送的消息。
Example - Online stock quotes or cricket score website.
#5楼
最大连接限制不是http2 + sse的问题。
这是http 1上的问题
#6楼
Opera,Chrome,Safari支持SharedWorker内的SSE,Chrome,Safari支持SSE Firefox支持XMLHttpRequest readyState交互,因此我们可以为Firefox创建EventSource polyfil
#7楼
Websocket和SSE(服务器发送事件)都能够将数据推送到浏览器,但是它们不是竞争技术。
Websockets连接既可以将数据发送到浏览器,也可以从浏览器接收数据。 可以使用websockets的应用程序的一个很好的例子是聊天应用程序。
SSE连接只能将数据推送到浏览器。 在线股票报价或Twitter的更新时间表或供稿是可以从SSE中受益的应用程序的很好示例。
实际上,由于SSE可以完成的所有事情也都可以通过Websockets完成,因此Websockets得到了更多的关注和喜爱,并且与SSE相比,更多的浏览器支持Websockets。
但是,对于某些类型的应用程序来说,它可能会显得过大,并且使用诸如SSE之类的协议可以更轻松地实现后端。
此外,可以将SSE填充到不仅使用JavaScript本身不支持它的旧版浏览器中。 可以在Modernizr github页面上找到SSE polyfills的一些实现。
陷阱:
- SSE受最大打开连接数的限制,这在打开各种选项卡时会特别痛苦,因为该限制是针对每个浏览器的,并且设置为一个非常低的数字(6)。 该问题在Chrome和Firefox中被标记为“无法解决”
- 只有WS可以传输二进制数据和UTF-8,而SSE限于UTF-8。 (感谢Chado Nihi)。
- 某些具有数据包检查功能的企业防火墙在处理WebSocket(Sophos XG防火墙,WatchGuard,McAfee Web Gateway)时遇到问题。
HTML5Rocks在SSE上有一些很好的信息。 从该页面:
服务器发送的事件与WebSockets
您为什么选择通过WebSockets发送服务器发送的事件? 好问题。
将SSE保留在阴影中的原因之一是因为后来的API(如WebSocket)提供了更丰富的协议来执行双向全双工通信。 对于游戏,消息传递应用程序以及需要双向双向近乎实时更新的情况,拥有双向通道更具吸引力。 但是,在某些情况下,不需要从客户端发送数据。 您只需要某些服务器操作的更新即可。 一些示例是朋友的状态更新,股票行情自动收录器,新闻提要或其他自动数据推送机制(例如,更新客户端Web SQL数据库或IndexedDB对象存储)。 如果您需要将数据发送到服务器,则XMLHttpRequest始终是朋友。
SSE通过传统的HTTP发送。 这意味着它们不需要特殊的协议或服务器实现即可正常工作。 另一方面,WebSockets需要全双工连接和新的Web Socket服务器来处理协议。 另外,服务器发送的事件具有WebSocket设计上缺少的各种功能,例如自动重新连接,事件ID和发送任意事件的功能。
TLDR摘要:
SSE相对于Websockets的优势:
- 通过简单的HTTP而不是自定义协议进行传输
- 可以用JavaScript进行多填充,以将SSE“反向移植”到尚不支持的浏览器。
- 内置对重新连接和事件ID的支持
- 更简单的协议
- 公司防火墙进行数据包检查没有问题
Websockets相对于SSE的优势:
- 实时,双向通讯。
- 在更多浏览器中的本机支持
SSE的理想用例:
- 股票行情自动收录
- Twitter提要更新
- 通知浏览器
SSE陷阱:
- 没有二进制支持
- 最大开放连接数限制
WebSockets与服务器发送的事件/ EventSource相关推荐
- jax-rs jax-ws_迟来总比没有好:SSE或服务器发送的事件现在已在JAX-RS中
jax-rs jax-ws 服务器发送的事件 (或简称为SSE )是非常有用的协议,它允许服务器通过HTTP将数据推送到客户端. 这是我们的Web浏览器支持的年龄,但是令人惊讶的是, JAX-RS规范 ...
- 迟来总比没有好:SSE或服务器发送的事件现在已在JAX-RS中
服务器发送的事件 (或简称为SSE )是非常有用的协议,它允许服务器通过HTTP将数据推送到客户端. 这是我们的网络浏览器支持的年龄,但令人惊讶的是, JAX-RS规范在很长一段时间内都忽略了这一点. ...
- rxjava 循环发送事件_使用RxJava和SseEmitter进行服务器发送的事件
rxjava 循环发送事件 Spring Framework 4.2 GA即将发布,让我们看一下它提供的一些新功能. 引起我注意的一个事件是一个简单的新类SseEmitter ,它是对Spring M ...
- 使用RxJava和SseEmitter进行服务器发送的事件
Spring Framework 4.2 GA即将发布,让我们看一下它提供的一些新功能. 引起我注意的一个事件是一个简单的新类SseEmitter ,它是对Spring MVC控制器中易于使用的发送事 ...
- HTML5支持服务器发送事件
来源 传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常 ...
- HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)
传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据 ...
- java sse spring_【SpringBoot WEB 系列】SSE 服务器发送事件详解
SSE 全称Server Sent Event,直译一下就是服务器发送事件,一般的项目开发中,用到的机会不多,可能很多小伙伴不太清楚这个东西,到底是干啥的,有啥用 本文主要知识点如下: SSE 扫盲, ...
- HTML5 服务器推送事件(Server-sent Events)实战开发
对于一般的 Web 应用开发,大多数开发人员并不陌生.在 Web 应用中,浏览器和服务器之间使用的是请求 / 响应的交互模式.浏览器发出请求,服务器根据收到的请求来生成相应的响应.浏览器再对收到的响应 ...
- sql server无法绑定由多个部分组成的标识符_HTML5服务器推送事件(Server-sent-event)...
在前端开发中,实现界面推送的方式,这里大概总结下三种方式 轮询(ajax),比较耗费服务器资源.COMET方式(COMET 技术并不是 HTML 5 ) websocket 双向数据推送,灵活,功能强 ...
最新文章
- Serverless特点及应用
- saltstack一些常用模块和api调用方法
- JBoss下布署Spring2.5和Struts2系统
- Android四大组之ContentProvider
- 18岁学计算机专业好不好,我18岁,学计算机编程,请问有没有什么书或者方法可以提高记忆力的?...
- c++ winpcap开发(4)
- LeetCode 696. Count Binary Substrings
- Redis数据结构之哈希
- VMvare桥接网络连接不上解决办法
- python可选参数定义_Python中函数的参数定义和可变参数用法实例分析
- 金蝶云星空python二开根据物料旧编码链接物料编码做单据
- 三节锂电池充电芯片,IC设计模块的几种电路
- 2022西工大网络安全知识竞赛赛后回顾资料
- 阴阳日历转换 公历日期转农历 八字排日柱算法
- svg绘制蝌蚪状飞线
- Java学习lesson 10
- 用python写字动画_Duang!用Python来实现唱歌、跳舞、写字、画画?无所不能的pyt
- 键盘的Win键失效或者被锁的解决办法
- sqlite3数据库的使用及其对应的API函数接口的使用
- IT行业三大热门专业,就业容易工资高,人才缺口比较大
热门文章
- 在editor模式下遍历unity3d builtsetting中的场景
- PHP数组合并的常见问题
- dubbox开发rest+json指南【转】
- SqlServer中char,varchar,nchar,nvarchar的区别
- 用HQL进行实体查询
- Net设计模式实例之组合模式(Composite Pattern)(3)
- 创建一个新的extender
- CCF CSP 201604-1 折点计数
- 虹软2.0 离线人脸识别 Android 开发 Demo
- Oracle Restart能够用来给Oracle GoldenGate 做 High Availability 使用么?