服务器发送事件 Golang

我想做某种方式的数据流,并且正在试验 SSE 与 Websockets。

使用 SSE 形成 golang 服务器,我发现在会话完成时如何通知客户端令人困惑。(例如,服务器已完成事件发送或服务器突然离线或客户端失去连接)

我需要做的一件事是可靠地知道这些断开连接的情况。不使用超时等。到目前为止我的实验,当我使服务器脱机时,客户端会获得 EOF。但是我在试图弄清楚如何从服务器向客户端发出连接关闭/完成的信号,然后如何处理/读取它时遇到了麻烦?EOF 是确定关闭/错误/完成状态的可靠方法吗?

许多 SSE 示例未能显示客户端良好的客户端连接处理。

使用 Websockets 会更容易吗?

任何经验建议最受赞赏。


桃花长相依
浏览 193回答 1
1回答

慕桂英4014372

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.readyStatees.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.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go