websocket Web套接字与服务器发送的事件/EventSource

cbjzeqam  于 2022-11-11  发布在  其他
关注(0)|答案(6)|浏览(301)

WebSockets和Server-Sent Events都可以向浏览器推送数据。在我看来,它们似乎是竞争技术。它们之间的区别是什么?什么时候你会选择其中一个?

nimxete2

nimxete21#

Websockets和SSE(服务器发送事件)都能够将数据推送到浏览器,但它们不是竞争技术。
Websockets连接既可以向浏览器发送数据,也可以从浏览器接收数据。一个可以使用Websockets的应用程序的很好的例子是聊天应用程序。
SSE连接只能将数据推送到浏览器。在线股票报价,或更新时间线或提要的twitter都是可以从SSE中受益的应用程序的很好例子。
在实践中,由于可以用SSE完成的所有事情也可以用Websockets完成,因此Websockets得到了更多的关注和喜爱,而且支持Websockets的浏览器比SSE多得多。
但是,对于某些类型的应用程序来说,它可能有些过头了,而后端可能更容易使用SSE之类的协议来实现。
此外,SSE可以使用JavaScript在不支持它的旧浏览器中进行多边形填充。一些SSE多边形填充的实现可以在Modernizr github page上找到。

缺点:

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

HTML5Rocks提供了一些关于SSE的有用信息。在该页面中:

服务器发送的事件与WebSocket

为什么您会选择服务器发送事件而不是WebSockets?问得好。
SSE一直处于阴影之下的一个原因是,像WebSockets这样的后期API提供了更丰富的协议来执行双向全双工通信。对于游戏、消息应用程序以及需要在两个方向上进行近乎实时更新的情况,拥有双向通道更有吸引力。然而,在某些情况下,数据并不需要从客户端发送,您只需要从服务器的某些操作中获取更新,例如朋友的状态更新、股票行情、新闻提要或者其他自动化的数据推送机制(例如更新客户端的WebSQL数据库或IndexedDB对象存储)。
SSE通过传统的HTTP发送。这意味着它们不需要特殊的协议或服务器实现来工作。另一方面,WebSocket需要全双工连接和新的Web Socket服务器来处理该协议。此外,服务器发送的事件具有WebSocket在设计上所缺乏的各种功能,如自动重新连接、事件ID和发送任意事件的能力。

TLDR摘要:

SSE相对于Web套接字的优势:

  • 通过简单HTTP而不是自定义协议传输
  • 可以使用javascript进行poly-filled,以便将SSE“反向移植”到尚不支持SSE的浏览器。
  • 内置对重新连接和事件ID的支持
  • 更简单的协议
  • 企业防火墙执行数据包检测时没有任何问题
    Web套接字相对于SSE的优势:
  • 真实的、双向通信。
  • 在更多浏览器中提供本机支持
    SSE的理想使用情形:
  • 股票报价器流
  • twitter提要更新
  • 通知浏览器
    SSE陷阱:
  • 无二进制支持
  • 最大打开连接数限制
mpbci0fu

mpbci0fu2#

根据caniuse.com:

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

  • EventSource,由雷米Sharp提供,不依赖于其他库(IE7+)
  • [美]瑞克·沃尔德龙著
  • EventSource by Yaffle(取代原生实现,跨浏览器规范行为)

如果你需要支持所有的浏览器,可以考虑使用web-socket-jsSignalRsocket.io这样的库,它们支持多种传输协议,如WebSockets,SSE,Forever Frame和 AJAX 长轮询。
要了解有关SSE的更多信息,请访问:

要了解有关WebSockets的更多信息,请访问:

其他差异:

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

neekobn83#

# # Web 套接 字 与 SSE

    • Web 套接 字 - * * 它 是 一 个 协议 , 通过 单个 TCP 连接 提供 全双工 通信 通道 。 例如 , 服务 器 和 浏览 器 之间 的 双向 通信 。 由于 该 协议 比较 复杂 , 服务 器 和 浏览 器 必须 依赖 于 websocket 库 , 该 库 为 socket.io
Example - Online chat application.

中 的 每 一 个

    • 上交 所( 服务 器 发送 事件 ) - * * 如果 是 服务 器 发送 事件 , 则 只 会 从 服务 器 到 浏览 器 进行 通信 , 浏览 器 不能 向 服务 器 发送 任何 数据 。 这种 通信 主要 用于 仅 需要 显示 更新 数据 的 情况 ,那么 每当 数据 更新 时 , 服务 器 就会 发送 消息 。 例如 , 服务 器 与 浏览 器 之间 的 单向 通信 。这个 协议 不 太 复杂 , 所以 不 需要 依靠 外部 库 JAVASCRIPT 本身 提供 的 EventSource 接口 来 接收 服务 器 发送 的 消息 。
Example - Online stock quotes or cricket score website.

格式

nwnhqdif

nwnhqdif4#

Opera、Chrome、Safari支持SSE、Chrome、Safari在SharedWorker内部支持SSE Firefox支持XMLHttpRequest readyState交互式,因此我们可以为Firefox创建事件源聚合文件

chhqkbe1

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

vngu2lb8

vngu2lb86#

它们在语义上是不同。
WebSocket具有“双向数据流”的本机语义含义。
而SSE具有“发布-订阅模式”或“请求-响应模式,尽管响应是流”的本机语义含义。
当然,您可以自己在WebSocket上实现一层“pub-sub模式”或“req-res模式”。

相关问题