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

yan*_*vps 5 comet server-sent-events server

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

然后,当服务器决定它可以向客户端发送数据时,当我尝试实现 SSE 时,我会看到每隔几秒发送一次的 fiddler 请求

对我来说,感觉就像长时间轮询,没有一个连接保持打开状态。

而且,并不是服务器决定向客户端发送数据就发送,而是只有当客户端发送下一个请求时才发送数据

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

小提琴手SS

Dar*_*ook 6

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

  • 客户端连接到服务器
  • 服务器神秘死机
  • 客户端等待两秒然后自动重新连接
  • 服务器神秘死机
  • 客户端等待两秒然后自动重新连接
  • ...

要修复服务器端脚本,您需要违背父母教给您的所有正确和错误的知识,并故意创建无限循环。所以,它最终会看起来像这样:

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

可能get next bit of data会轮询数据库表以获取自上次轮询以来的新记录,或者扫描文件系统目录以获取新文件等。

或者,如果服务器端进程是长时间运行的数据分析,您的脚本可能如下所示:

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

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