mcb*_*n83 5 go websocket http-streaming server-sent-events
我想以某种方式进行数据流传输,并尝试使用SSE与Websockets。
使用SSE构成golang服务器,我发现它使会话结束时如何通知客户端感到困惑。(例如,服务器已完成事件的发送或服务器突然脱机或客户端失去连接)
我需要做的一件事就是可靠地知道何时断开连接。到目前为止,还没有使用超时等方法。我的实验是,当我使服务器脱机时,客户端会收到EOF。但是我很难弄清楚如何从服务器向客户端发送信号,表明连接已关闭/完成,然后如何处理/读取它?EOF是确定关闭/错误/完成状态的可靠方法吗?
SSE的许多示例都无法说明客户端良好的客户端连接处理。
使用Websockets会更容易吗?
任何经验建议最感激。
谢谢
SSE 标准要求,如果连接丢失或服务器故意关闭套接字,则浏览器在 N 秒后自动重新连接。(N 在 Firefox 中默认为 5,在 Chrome 和 Safari 中默认为 3,我上次检查过。)因此,如果需要的话,您不需要执行任何操作。(在 WebSocket 中,您必须自己实现这种重新连接。)
如果不需要这种重新连接,您应该向客户端发送一条消息,说“演出结束了,走开”。例如,如果您正在传输金融数据,您可能会在周五晚上市场收盘时发送该数据。然后,客户端应该拦截此消息并从其一侧关闭连接。(然后套接字将消失,因此服务器进程将自动关闭。)
在 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);
Run Code Online (Sandbox Code Playgroud)
更新:
您可以通过监听“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.");
}
Run Code Online (Sandbox Code Playgroud)
没有其他可用信息,但更重要的是,它无法区分您的服务器进程故意关闭连接、您的 Web 服务器崩溃或您客户端的互联网连接中断。
您可以自定义的另一件事是重试时间,方法是让服务器发送消息retry:NN
。因此,如果您不想快速重新连接,而是希望在任何重新连接尝试之间至少间隔 60 秒,请让您的服务器发送retry:60
.