【问题标题】:How to keep connection alive in GO's websocket如何在 GO 的 websocket 中保持连接活跃
【发布时间】:2014-07-02 01:14:09
【问题描述】:

我在服务器中使用code.google.com/p/go.net/websocket,因此客户端可以从服务器获取通知。

然而,似乎客户端连接到服务器后,如果客户端和服务器之间没有任何数据传输,服务器将在websocket.JSON.Receive()返回EOF错误,看起来像一个超时机制。

我在谷歌上搜索了一下,websocket协议好像有ping-pong心跳来保持连接,请问code.google.com/p/go.net/websocket是否支持这个ping协议?
如果我想保持客户端和服务器之间的连接,我应该怎么做?

【问题讨论】:

  • 请发布您的 websocket 处理程序的 go 代码。可能你只需要添加一个for 循环就可以了

标签: websocket go


【解决方案1】:

这里是 gorilla/websocket 包的有效插入式解决方案。

func keepAlive(c *websocket.Conn, timeout time.Duration) {
    lastResponse := time.Now()
    c.SetPongHandler(func(msg string) error {
       lastResponse = time.Now()
       return nil
   })

   go func() {
     for {
        err := c.WriteMessage(websocket.PingMessage, []byte("keepalive"))
        if err != nil {
            return 
        }   
        time.Sleep(timeout/2)
        if(time.Since(lastResponse) > timeout) {
            c.Close()
            return
        }
    }
  }()
}

【讨论】:

  • 从哪里调用这个方法 'keepAlive'?
【解决方案2】:

就在 2013 年,go.net websocket 库 does not support (automatic) keep-alive messages。你有两个选择:

  • 通过定期让您的应用程序沿管道发送一条消息(任何一个方向都应该有效)来实现“应用程序级别”保持活动,该消息被另一方忽略。
  • 移至支持 keep-alives (like this one) 的其他 websocket 库编辑:看起来该库已被 Gorilla websockets 取代。

【讨论】:

  • 如果自己实现,keep-alive的时间跨度是多少?
  • 这可能值得一个新的 SO 问题。
猜你喜欢
  • 2011-05-21
  • 2011-08-07
  • 2020-12-06
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多