服务器发送的事件Golang

mcb*_*n83 5 go websocket http-streaming server-sent-events

我想以某种方式进行数据流传输,并尝试使用SSE与Websockets。

使用SSE构成golang服务器,我发现它使会话结束时如何通知客户端感到困惑。(例如,服务器已完成事件的发送或服务器突然脱机或客户端失去连接)

我需要做的一件事就是可靠地知道何时断开连接。到目前为止,还没有使用超时等方法。我的实验是,当我使服务器脱机时,客户端会收到EOF。但是我很难弄清楚如何从服务器向客户端发送信号,表明连接已关闭/完成,然后如何处理/读取它?EOF是确定关闭/错误/完成状态的可靠方法吗?

SSE的许多示例都无法说明客户端良好的客户端连接处理。

使用Websockets会更容易吗?

任何经验建议最感激。

谢谢

Dar*_*ook 3

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.