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

12

我在服务器上使用code.google.com/p/go.net/websocket,这样客户端就可以从服务器接收通知。

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

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


1
请发布您的WebSocket处理程序的Go代码。可能只需要添加一个for循环即可。 - Milan Halada
2个回答

13

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

1
这个方法“keepAlive”会从哪里调用? - Aaron Dsouza

4
截至2013年,go.net websocket库不支持(自动)keep-alive消息。你有两个选择:
  • 通过定期让应用程序向管道发送一条被对方忽略的消息(任何方向都可以),实现“应用级”keep-alive。
  • 切换到另一个支持keep-alives的websocket库(例如这个编辑:看起来该库已经被Gorilla websockets取代。

如果自己实现,保持连接的时间跨度是多久? - Jerry YY Rain
1
这可能值得发一个新的SO问题。 - laslowh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接