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

SSE服务器发送事件-客户端继续发送请求(如轮询)

公西国发
2023-03-14

为什么每个站点都解释说在SSE中,客户端和服务器之间的单个连接保持打开状态“使用SSE,客户端发送标准HTTP请求请求事件流,服务器最初以标准HTTP响应响应并保持连接打开”

然后,当服务器决定可以向客户端发送数据,而我试图实现SSE时,每隔几秒钟就会看到fiddler请求被发送

对我来说,这感觉就像是长时间的投票,没有一个连接保持打开。

此外,并不是服务器决定向客户机发送数据,而是只有在客户机发送下一个请求时才发送数据

如果我用重试:10000响应,即使服务器现在想要通知的艰难事情发生了,也只会在下一个请求(从现在开始的10秒内)到达客户端,这对我来说并不真正看起来像是保持打开的连接,服务器会尽快发送数据

共有1个答案

邓毅
2023-03-14

您的服务器正在立即关闭连接。SSE有一个内置的重试功能,用于连接丢失时进行重试,因此您看到的是:

  • 客户端连接到服务器
  • 服务器已死亡
  • 客户端等待两秒钟,然后自动重新连接
  • 服务器已死亡
  • 客户端等待两秒钟,然后自动重新连接

为了修复服务器端脚本,你想违背父母教给你的关于对错的一切,故意创建一个无限循环。所以,它最终会看起来像这样:

validate user, set up database connection, etc.
while(true){
  get next bit of data
  send it to client
  flush
  sleep 2 seconds
  }

其中,get next bit of data可能会轮询DB表以查找自上次轮询以来的新记录,或者扫描文件系统目录以查找新文件,等等。

或者,如果服务器端进程是一个长期运行的数据分析,那么您的脚本可能会如下所示:

validate user, set-up, etc.
while(true){
  calculate next 1000 digits of pi
  send them to client
  flush
  }

这假设计算行至少需要半秒钟才能运行;如果更频繁,您将开始用大量小包数据堵塞套接字,但没有任何好处(用户不会注意到他们每秒获得10次更新而不是2次更新/秒)。

 类似资料:
  • 为什么每个站点都解释说,在SSE中,客户端和服务器之间只有一个连接保持打开状态“在SSE中,客户端发送一个标准的HTTP请求,请求一个事件流,服务器最初以标准的HTTP响应进行响应,并保持连接打开” 然后,当服务器决定它可以向客户机发送数据时,我正在尝试实现SSE,我会看到每隔几秒钟发送一次fiddler请求 对我来说,这感觉像是长时间的轮询,没有一个连接保持打开。

  • 我正在开发一个连接到服务器的web应用程序,我需要服务器在给定的时间向客户机推送一些信息。 有人会强调这些技术吗(也许还有其他一些推动技术。)这符合我的问题,哪一种情况更适合每一种情况? 非常感谢,我想我在这个领域完全迷失了。

  • 我有一个使用SSE向附加客户端发送更新的node.js服务器。偶尔,我会收到服务器错误H27。与此同时,其他客户端请求可能会在客户端重新注册到SSE事件服务时丢失。 客户端获取/事件请求与服务器H27错误之间的时间介于13秒到19:35分钟之间(在遇到的30次不同事件中)。但GET/事件请求的定时与相应的H27错误之间存在完全的相关性。我每50秒从服务器发送一条keep-alive消息,以绕过He

  • 客户端通过HTTP请求(通过浏览器post)调用Servlet,然后Servlet应向外部网站发送请求(get),并从网站接收响应(post)。servlet继续响应并向客户端发送响应(post)。 我的问题是如何在Servlet中发送和接收请求/响应并将某些内容发送回客户端?

  • 我有一个NodeJS应用程序,它使用服务器发送事件(SSE)路由将更新从服务器发送到客户端。在我的本地开发环境中,这非常有效,因为客户端始终保持与SSE路由的连接,并且在断开连接时尝试立即重新连接。 然而,一旦我将我的应用程序部署到Heroku,一切都出了问题。在没有通过SSE路由发送任何数据的几秒钟内,我在客户端收到一个503服务不可用的错误,客户端失去了与服务器的连接,因此无法接收任何实时更新

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