如何在 GO 的 websocket 中保持连接活跃



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

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

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

这是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
        }
    }
  }()
}

直到2013年,go.net websocket库还不支持(自动)keep-alive消息。您有两个选项:

  • 通过周期性地让你的应用程序向管道发送一个消息(任何一个方向都应该工作)来实现一个"应用程序级"的keep-alive,该消息被另一方忽略。
  • 移动到另一个支持keep-alive的websocket库(就像这个)编辑:看起来这个库已经被大猩猩websockets取代了。

相关内容

  • 没有找到相关文章