当前位置: 首页 > 知识库问答 >
问题:

为什么以及如何SSE(服务器发送事件)是单向的

邰钟展
2023-03-14

https://developer.mozilla.org/en-US/docs/Web/API/EventSource

EventSource接口是web内容与服务器发送事件的接口。EventSource实例打开到HTTP服务器的持久连接,HTTP服务器以文本/事件流格式发送事件。通过调用EventSource,连接将保持打开状态,直到关闭。关闭()。

据我所知,服务器发送的事件需要持久的HTTP连接(Connection: Keep-live),这类似于在Web套接字的情况下保持连接处于活动状态。

如果连接是持久的,为什么服务器发送的事件是单向的?Web套接字连接也是持久的。

在这种情况下,如果我向HTTP服务发送请求,并且由于事件源打开了持久连接,会发生什么情况。它会重新使用EventSource打开的HTTP连接还是打开一个新连接?

如果它重新使用EventSource打开的连接,它如何被认为是单向的?

可能是微不足道的,但我不得不问,因为它不清楚。因为没有任何内容提到当EventSource打开现有连接时,后续HTTP请求会发生什么。

例如,我似乎可以使用SSE实现集中式聊天应用程序:

用户1向用户2发送消息(通过将消息发送到HTTP服务器)。服务器向用户2发送带有新消息的事件,用户2向HTTP服务器发送带有用户1消息的另一个请求,服务器向用户1发送事件。

这怎么不被认为是双向的?

相关:

HTTP Stay-Alive和Webockets之间的行为差异是什么?

共有1个答案

郭琨
2023-03-14

SSE是单向的,因为当您打开SSE连接时,只有服务器可以向客户端(浏览器等)发送数据。客户端无法发送任何数据。SSE比WebSockets稍旧,因此可能是这两种技术之间单向和双向支持的区别。

在您的用例中,如果您打开SSE连接(即HTTP连接),则只有服务器能够发送数据。如果您希望向HTTP发送请求

您可以实现与SSE的聊天。您可以有一个SSE连接(因此是HTTP)来让用户接收来自服务器的消息。您可以使用POST HTTP

请注意,大多数浏览器都可以在6 HTTP/1左右打开。x个到同一主机的连接。因此,如果您使用1个SSE连接,它可能会保持5个HTTP/1。x连接。这仅适用于HTTP/1。x、 使用HTTP 2。x、 到同一主机的连接是多路复用的:因此,理论上,您可以根据需要在同一时间发送任意多个HTTP请求,也可以根据需要打开任意多个SSE连接,从而通过6个连接的限制。

你可以看看这篇文章(https://streamdata.io/blog/push-sse-vs-websockets/)还有这个视频(https://www.youtube.com/watch?v=NDDp7BiSad4)了解这项技术以及它是否能满足您的需要。他们总结了优点

 类似资料:
  • 我想要实现的是: user1向服务器发送消息(一个简单的POST请求) 服务器部分是(events.php) 我在(true)时尝试了无限循环以避免3秒的轮询。我也尝试过没有那个无限循环。只有发送消息的用户收到事件。 我理解这种做法并不好。但是,将SSE用于聊天应用程序的最佳实践是什么? 如何向所有用户发送事件?

  • 我无法理解HTML5s服务器发送的事件是否真的适合ReST体系结构。我知道并非HTML5/HTTP的所有方面都需要适合ReST架构。但我想从专家那里知道HTTP的哪一半是SSE(ReSTful的一半还是另一半!)。 一种观点是它是ReSTful的,因为客户端向服务器发出了一个“初始”HTTP GET请求,其余的只能看作是不同内容类型的部分内容响应(“文本/事件流”) 发送的请求不知道有多少响应将作

  • 我是 SSE(服务器发送事件)的新手。我找到了一种在Spring启动中使用SSE发送响应的方法。我能够每 20 秒发送一次响应。我用下面的代码做同样的事情。 但问题是,这个方法每20秒就被调用一次。 但是,我的要求是每20秒向客户端发送一次空响应,并在新用户添加到数据库时发送响应。 如何实现我的目标?或者我在概念上完全错了。

  • 您好,我正在React中开发一个web应用程序,它使用Nginx从Express服务器接收SSE数据。 JS服务器 索引:JS const events=新事件源('https://api.myDomain.com/events', ); axios。post(<代码>https://api.myDomain.com/addCart,{客户端:this.state.clientId,购物车:car

  • 我想知道是否可以为服务器发送的事件(SSE;内容类型:文本/事件流)启用gzip压缩。 根据这本书,似乎有可能:http://chimera.labs.oreilly.com/books/1230000000545/ch16.html 但是我找不到任何带有gzip压缩的SSE示例。我尝试发送带有响应标头字段Content-Encode设置为“gzip”的gzip消息,但没有成功。 为了在SSE周围

  • 我有以下Quarkus资源: 这将生成没有事件名称的事件,并且只生成数据部分。如何指定事件名称?