【问题标题】:Server sent events (SSE) - automatic reconnect服务器发送事件 (SSE) - 自动重新连接
【发布时间】:2020-05-01 11:38:26
【问题描述】:

我无法理解 SSE 的“自动重新连接”是如何工作的。

我一直在阅读 Mozilla 和 WC3 的文档以及其他一些讨论,但我仍然不确定它是如何工作的。

https://html.spec.whatwg.org/multipage/server-sent-events.html https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events

我已经在 Golang 中使用 gorilla/mux 实现了 SSE,并且一切正常。现在到了有趣的部分,我可以断开与服务器的连接,但连接会在几秒钟后神奇地恢复。我自己没有为此实现任何功能,所以我不确定这是怎么发生的?

所有主流浏览器都会尝试自动重新连接,但我从未手动设置任何事件 ID。浏览器会重新连接,但不会收到断开连接期间发送的任何丢失数据吗? (这就是使用EventID可以解决的问题,但我对它没有兴趣)。即,浏览器是否可以在不使用 EventID 的情况下重新连接?或者是其他什么东西使这种“重新连接”成为可能?

【问题讨论】:

  • 客户端自动重新连接到服务器,并将标头 Last-Event-ID 设置为服务器发送的最后一个 ID。服务器应用程序可以使用该 ID 回填在断开连接期间丢失的数据。

标签: http go server-sent-events


【解决方案1】:

根据规范,客户端必须发送 Last-Event-Id 标头来告诉服务器它成功接收到的最后一个事件id。仅当事件发送 with id 字段为空值(与仅发送数据和完全省略 id 不同)Last-Event-Id 在客户端重置(您可以将其视为块交易)。

参见https://www.w3.org/TR/2009/WD-eventsource-20090421/中的第5节处理模型

如果事件源的最后一个事件 ID 字符串不是空字符串,则请求中必须包含一个 Last-Event-Id HTTP 标头,其值是事件源的最后一个事件 ID 字符串的值。

稍后在第 7 节解释事件流中有很好的解释,描述了 test-stream 的实际示例,说明客户端发送的 Last-Event-Id 如何受到事件 id 的值(和存在)的影响。

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多