我想做一些单向数据流,并正在试验SSE与Websockets。
使用SSE表单作为一个golang服务器,我发现在会话结束时如何通知客户端是令人困惑的。(如服务器已完成发送事件,或服务器突然脱机或客户端断开连接)
我需要的一件事是可靠地知道当这些断开的情况。到目前为止,当我将服务器离线时,客户端会得到EOF。但是,我很难弄清楚如何从服务器向客户端发送连接已关闭/完成的信号,然后如何处理/读取它呢?EOF是确定关闭/错误/完成状态的可靠方法吗?
许多使用SSE的示例未能显示客户端良好的客户端连接处理。
对于Websockets来说,这会更容易吗?
任何经验,建议,最受赞赏。
谢谢
发布于 2015-07-07 21:48:53
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;
//Tell user what just happened.
}
else{
//Normal processing here
}
},false);更新:
您可以通过侦听“关闭”事件,然后查看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服务器崩溃或客户端internet连接中断之间的区别。
您可以定制的另一件事是重试时间,方法是让服务器发送一条retry:NN消息。因此,如果您不希望快速重新连接,而是希望在任何重新连接尝试之间至少有60秒的时间,请让您的服务器发送retry:60。
https://stackoverflow.com/questions/31268628
复制相似问题