使用服务器发送事件进行双向客户端-服务器通信(而不是 WebSocket)的缺点

2024-05-05

最近,我发现服务器发送事件是 WebSocket 的一种更简单的替代方案,用于从服务器进行推送。大多数比较它们的地方(例如here https://stackoverflow.com/questions/5195452/websockets-vs-server-sent-events-eventsource, here http://www.html5rocks.com/en/tutorials/eventsource/basics/ and here http://www.html5rocks.com/en/tutorials/casestudies/sunlight_streamcongress/)说如果客户端和服务器之间不需要全双工通信,那么 WebSockets 就有点过头了,SSE 就足够了。

我的问题是,当您确实需要双向通信(例如聊天)时,使用常规 ajax 请求从客户端发送消息并使用服务器流接收消息时,使用 SSE 的缺点是什么?考虑到我在服务器端几乎不需要做任何配置就可以使用 SSE,这似乎是一个更有吸引力的选择。


SSE 优点通过 WebSocket:

  • 无需进行特殊的 Web 服务器或 Web 代理更改。
  • 定义自定义事件(否则客户端API基本相同)
  • 更轻松地集成现有身份验证机制(OAuth、OpenID 等)

SSE 缺点与 WebSocket 相比:

  • 单向通信通道(服务器到客户端)。客户端到服务器需要单独的通道。
  • 浏览器支持更加有限(没有本机 IE 支持,而 IE 10 支持 WebSockets):WebSockets http://caniuse.com/#search=websockets, SSE http://caniuse.com/#search=eventsource
  • 依赖客户端来验证来源(可能比 WebSocket 更容易受到 XSS 攻击)
  • 没有对二进制类型的本机支持(WebSockets 支持使用 ArrayBuffers 和 Blob 的原始帧)。
  • 即使 SSE 端点不提供静态 Web 内容,也需要成熟的 Web 服务器(独立的 WebSocket 服务器可能相当简单)
  • 与使用 WebSocket 连接相比,使用 AJAX 进行双向通信的 SSE 具有更高的往返延迟和更高的客户端->服务器带宽。这是由于每个客户端->服务器 AJAX 请求的连接设置开销造成的。此外,SSE 的服务器->客户端延迟可能会出现峰值,因为在许多配置中,长期保持的连接最终将被关闭(通常每 30 秒一次)并且需要重新打开,从而导致服务器->客户端延迟出现临时峰值。

参考:

  • http://www.html5rocks.com/en/tutorials/eventsource/basics/ http://www.html5rocks.com/en/tutorials/eventsource/basics/
  • https://developer.mozilla.org/en-US/docs/Server-sent_events https://developer.mozilla.org/en-US/docs/Server-sent_events
  • https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events
  • http://dev.w3.org/html5/eventsource/ http://dev.w3.org/html5/eventsource/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用服务器发送事件进行双向客户端-服务器通信(而不是 WebSocket)的缺点 的相关文章

随机推荐

  • 如何在没有 Express 的情况下通过 Mongoose 与 MongoDB 交互?

    我想要一个可以牢固掌握 CRUD 操作如何工作的环境 到目前为止 我一直在使用views看看数据是什么样子 但由于明显缺乏灵活性 这种方法并不是那么有洞察力 这就像在黑暗中开车一样 现在我希望能够通过 Mongoose 提供的功能来处理 M
  • 一般重写 Scala 案例类

    是否可以通用地替换案例类中的参数 更具体地说 假设我想要一个接收 查找 案例类和 替换 案例类 如语法规则的左侧和右侧 以及目标案例类的替代函数 并且该函数将返回将查找案例类的参数替换为替换案例类的新案例类 该函数还可以简单地采用一个案例类
  • 如何使用 Office.js 查找 Office AddIn Host(它是 Word 应用程序还是 Excel)?

    我正在创建一个 Office AddIn 它可以在 Excel 和 Word 应用程序中使用 并且基于主机 如果它是 Word 或 Excel 主机 我想执行不同的逻辑 我正在使用office js 创建office Addin 例如 le
  • MUI 数据表上的 selectRow

    这是我第一次尝试MUI 数据表 https github com gregnb mui datatables在反应中 我想从复选框中选择的行中获取数据 const options download false print false vie
  • 如何在 mongodb 中使用一个查询更新每个值

    我有一个数据如下 id 1 exist true id 2 exist false id 3 exist false 当我 findOneAndUpdate id 2 exist true 时 我希望使用聚合等在一个查询中自动将 id 1
  • 如何从 UIActivityViewController 获取标题和 messageBody 元数据到自定义 UIActivity?

    从 iOS 13 开始 您可以创建一个UIActivityViewController用一个UIActivityItemsConfiguration 那有一个perItemMetadataProvider允许您提供标题和消息正文的回调 完成
  • 结合使用 COUNTIF 和 VLOOKUP EXCEL

    我有多个电子表格workbook我想要以下基本内容English talk IF worksheet1 cell A3 出现在 工作表 2 B 列中 计算它在 工作表 2 b 列中出现的次数 换句话说 让我们说A3 BOB smith 在工
  • 当你不需要Python中的索引时,如何创建For循环? [复制]

    这个问题在这里已经有答案了 如果我需要一个forPython 中的循环 for i in range 1 42 print spam 但不要使用i对于任何事情 pylint 都会抱怨未使用的变量 我应该如何处理这个问题 我知道你可以这样做
  • 关于Java中trim()方法的查询

    我之前提出了一个问题 但遭到了严厉的批评 所以我在这里再次提出 更简单 并重新措辞以吸引那些可能担心我之前提出问题的方式的人 背景 我正在解析一些 HTML 以获取信息 我将所有内容隔离在一系列行中 但我希望抓取的内容以及后面的一堆空格 为
  • 在哪里声明类常量?

    我使用类成员来保存常量 例如 function Foo Foo CONSTANT1 1 Foo CONSTANT2 2 这工作得很好 除了它看起来有点无组织 所有代码都特定于Foo遍布全球范围 所以我考虑将常量声明移到内部Foo 声明 但是
  • C 获取监听服务器的IP

    我正在使用 C 套接字编写客户端 服务器程序 我指定服务器可以通过使用 sockaddr in sin addr s addr 中的 INADDR ANY 侦听任何网络接口 这相当于 IP 0 0 0 0 我可以获取服务器正在监听的实际IP
  • APT:Post-Invoke 在 debian:bookworm-slim 上失败

    我有一个 Jenkins 管道 它使用docker dind 20 在这个过程中我做 FROM ruby 3 2 slim bookworm apt get update 当我尝试使用我的本地构建映像 MacOS ventura 时dock
  • 如何使用静态方法最小起订量静态类(UnitOfWork 情况)?

    我有这些课程 public static class UnitOfWorkSS public static IUnitOfWork Begin return IoC Resolve
  • CSS:变换:翻译(-50%,-50%)使文本模糊[重复]

    这个问题在这里已经有答案了 我想将我的div我使用这种方法 但它使我的文本在div blurry div top 50 left 50 webkit transform translate 50 50 transform translate
  • iOS - App Store - 更改订阅的到期日期

    我想使用 Play 商店 API 更改 Play 商店中订阅的到期日期 我有一个移动应用程序 您可以在其中购买续订应用商店订阅或者您可以从应用程序中的促销活动中免费获得一些时间 这里的主要问题是如果您已从 App Store 购买了订阅 并
  • Dispatcher.BeginInvoke() 未异步运行

    这是我想做的事情的简化版本 onClick abutton a aNewMethod 将异步运行以保持 UI 响应 就是这样 我读过一些答案 这是我能想到的 private async void button Click object se
  • 如何建立数据流挖掘的滑动窗口模型?

    我们遇到的情况是 流 来自传感器的数据或服务器上的点击流数据 采用滑动窗口算法 我们必须将最后 例如 500 个数据样本存储在内存中 然后 这些样本用于创建直方图 聚合并捕获有关输入数据流中异常的信息 请告诉我如何制作这样的滑动窗 如果您询
  • Kotlin 高阶函数参数:传递子类型

    我在 Kotlin 中遇到了函数参数的问题 我将借助一些代码来解释这个问题 我创建了一个类层次结构 当我将子类型传递给需要父类型的函数时 没有问题 open class A val i Int class B val j Int A j f
  • 格式化小数 2 位 - 没有尾随零

    格式 格式化我的数字 但它会将我的小数点向上舍入 我需要保留我的小数 有这样的格式吗 谢谢 广告尽可能多 根据需要 To always显示小数位 使用0代替
  • 使用服务器发送事件进行双向客户端-服务器通信(而不是 WebSocket)的缺点

    最近 我发现服务器发送事件是 WebSocket 的一种更简单的替代方案 用于从服务器进行推送 大多数比较它们的地方 例如here https stackoverflow com questions 5195452 websockets v