为了账号安全,请及时绑定邮箱和手机立即绑定

服务器发送事件 Golang

服务器发送事件 Golang

Go
桃花长相依 2021-10-18 17:07:29
我想做某种方式的数据流,并且正在试验 SSE 与 Websockets。使用 SSE 形成 golang 服务器,我发现在会话完成时如何通知客户端令人困惑。(例如,服务器已完成事件发送或服务器突然离线或客户端失去连接)我需要做的一件事是可靠地知道这些断开连接的情况。不使用超时等。到目前为止我的实验,当我使服务器脱机时,客户端会获得 EOF。但是我在试图弄清楚如何从服务器向客户端发出连接关闭/完成的信号,然后如何处理/读取它时遇到了麻烦?EOF 是确定关闭/错误/完成状态的可靠方法吗?许多 SSE 示例未能显示客户端良好的客户端连接处理。使用 Websockets 会更容易吗?任何经验建议最受赞赏。
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

SSE 标准要求浏览器在 N 秒后自动重新连接,如果连接丢失或服务器故意关闭套接字。(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.


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信