我正在使用此代码向浏览器客户端发送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,有没有办法收到确认?
答案 0 :(得分:1)
SSE是一对多的Push协议。所以没有确认。您可以在收到时发回AJAX请求,但模式中没有任何内容可以提供此功能。
答案 1 :(得分:0)
SSE是一种单向通信协议,用于将数据从服务器推送到客户端。
客户无法接受事件接收。
如果必须有确认,您可能需要像websockets这样的双向通信。
答案 2 :(得分:0)
我知道这已经有很多年了,但是没有一个答案是正确的。 1)TCP确实确实对推送流进行了ACK-它的标准http! (尽管您的代码是否足够低以至于无法检测到它是另外一个故事)
2)开发您自己的ACK系统并不困难(我已经做到了!-当最后一个客户端消失时释放资源),是的,它倾向于违背协议的“精神”并复制到一定程度的websocket范式...但是说它不可能是错误的。在浏览器保存的第一条消息中发送每个客户端唯一的“令牌”,并启动一个js“ ping”计时器,该计时器可以阻止“仍然存在”的消息。在您的erver代码中,处理ajax并重新启动client-stil-alive计时器。如果过期,则客户端已消失,清理/释放资源等。
是的,它有点“笨拙”,但它可以正常工作,并且没有火箭科学的困难。
我(很晚)才获得2分钱