我在服务器中使用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取代了。