首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务器发送事件Golang

服务器发送事件Golang
EN

Stack Overflow用户
提问于 2015-07-07 12:31:57
回答 1查看 5.3K关注 0票数 5

我想做一些单向数据流,并正在试验SSE与Websockets。

使用SSE表单作为一个golang服务器,我发现在会话结束时如何通知客户端是令人困惑的。(如服务器已完成发送事件,或服务器突然脱机或客户端断开连接)

我需要的一件事是可靠地知道当这些断开的情况。到目前为止,当我将服务器离线时,客户端会得到EOF。但是,我很难弄清楚如何从服务器向客户端发送连接已关闭/完成的信号,然后如何处理/读取它呢?EOF是确定关闭/错误/完成状态的可靠方法吗?

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

对于Websockets来说,这会更容易吗?

任何经验,建议,最受赞赏。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-07 21:48:53

SSE标准要求浏览器在N秒后自动重新连接,如果连接丢失或服务器故意关闭套接字。(据我上次检查,Firefox中默认为5,Chrome和Safari中为3。)因此,如果这是可取的,你不需要做任何事情。(在WebSockets中,您必须自己实现这种重新连接。)

如果这种重新连接是不可取的,你应该向客户发送一条信息,说“节目结束了,走开”。如果你是在流动金融数据,你可能会在周五晚上,当市场关闭的时候发送。然后,客户端应拦截此消息,并从其一侧关闭连接。(套接字将随之消失,因此服务器进程将自动关闭。)

在JavaScript中,假设您使用JSON发送数据,则如下所示:

代码语言:javascript
复制
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,找出重新连接发生的时间。

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31268628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档