1

我正在使用此代码向浏览器客户端发送 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,有什么方法可以收到确认吗?

4

3 回答 3

1

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

于 2015-08-20T22:13:23.473 回答
0

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

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

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

于 2015-10-21T13:26:36.650 回答
0

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

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

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

只是我的(很晚)2c值

所附图像是我诊断缺少 ACK 的情况,但是除了指示的一个之外,每隔一个你可以看到 ACK 在此处输入图像描述

于 2020-05-19T13:13:09.317 回答