【问题标题】:How to capture SSE Eventsource acknowledgement如何捕获 SSE 事件源确认
【发布时间】:2020-05-19 21:13:09
【问题描述】:

我正在使用此代码向浏览器客户端发送 SSE 消息。

https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback

节点服务器

    response.writeHead(200, {  'Content-Type': 'text/event-stream', 'Access-Control-Allow-Origin': '*' });
    response.write(message);
    response.end();

对于我正在使用这个 javascript 的客户端:

var source = new EventSource('myurl');
source.addEventListener('add', addHandler, false);
source.addEventListener('remove', removeHandler, false);

一切正常,但是服务器如何确定客户端确实收到了它?我猜SSE正在使用TCP,有什么方法可以收到确认吗?

【问题讨论】:

    标签: javascript node.js server-sent-events eventsource


    【解决方案1】:

    SSE 是一对多推送协议。所以没有承认。您可以在收到时发回 AJAX 请求,但模式中没有提供此功能的内容。

    【讨论】:

      【解决方案2】:

      SSE 是一种将数据从服务器推送到客户端的单向通信协议。

      客户端无法确认事件接收。

      如果确认是必须的,您可能需要像 websockets 这样的双向通信。

      【讨论】:

        【解决方案3】:

        我知道这已经有很多年了,但没有一个答案是正确的。 1) TCP 确实 ACK 推送流 - 它的标准 http! (尽管您的代码是否处于足够低的级别以检测到它是另一回事)

        2) 开发自己的 ACK 系统并不难(我已经做到了!- 在最后一个客户端消失时释放资源),是的,它往往违背协议的“精神”并复制到一定程度上是 websocket 范式......但说它不可能是错误的。在浏览器保存的第一条消息中发送一个唯一的每个客户端“令牌”,并启动一个 js“ping”计时器,该计时器 ajaxes 一条“仍然活着”的消息。在您的 erver 代码中,处理 ajax 并重新启动 client-stil-alive 计时器。如果过期,客户端已经离开,清理/释放资源等。

        是的,它有点“笨拙”,但它很有效,而且不是火箭科学的难度。

        只是我(很晚)的 2c 价值

        附加的图像是我诊断缺少 ACK 的情况,但是除了指示的一个之外,每隔一个你可以看到 ACK

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-23
          • 2010-10-29
          • 2018-06-27
          • 1970-01-01
          • 1970-01-01
          • 2012-03-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多