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

Jer*_*ain 7 go websocket

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

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

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

小智 5

这是适用于大猩猩/ 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.Now().Sub(lastResponse) > timeout) {
            c.Close()
            return
        }
    }
  }()
}
Run Code Online (Sandbox Code Playgroud)


las*_*owh 4

就在 2013 年,go.net websocket 库还不支持(自动)保持活动消息。您有两个选择:

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