SSE标准要求浏览器在N秒后自动重新连接,如果连接丢失或服务器故意关闭套接字。(在Firefox中,默认值为5,在Chrome和Safari中,默认值为3,上次我检查过。)所以,如果需要这样做,您不需要做任何事情。(在WebSockets中,您必须自己实现这种重新连接。)
如果不需要这种重新连接,则应向客户端发送一条消息,指示“演出结束,请离开”。例如,如果您正在流式传输金融数据,则可以在星期五晚上发送此消息,当市场关闭时。然后客户端应截取此消息并从其端关闭连接。(然后套接字将消失,因此服务器进程将自动关闭。)
在JavaScript中,并假设您正在使用JSON发送数据,代码大致如下:
var es = EventSource("/datasource");
es.addEventListener("message", function(e){
var d = JSON.parse(e.data);
if(d.shutdownRequest){
es.close();
es=null;
}
else{
}
},false);
更新:
通过监听 "close" 事件,您可以了解重新连接发生的时间,然后查看 e.target.readyState
。
es.addEventListener("error", handleError, false);
function handleError(e){
if(e.target.readyState == 0)console.log("Reconnecting...");
if(e.target.readyState == 2)console.log("Giving up.");
}
没有其他信息可用,但更重要的是它无法区分您的服务器进程故意关闭连接、Web服务器崩溃还是客户端的互联网连接中断。
另一件您可以自定义的事情是重试时间,通过让服务器发送 retry:NN
消息来实现。因此,如果您不想进行快速重新连接,而是希望在任何重新连接尝试之间至少等待 60 秒,请让您的服务器发送 retry:60
。
EventSource
吗? - dm03514