Reputation: 4382
I use code.google.com/p/go.net/websocket
in server, so client can get notification from server.
however, It seems after client connected to server, if there is no any data tranfer between client and server, server will return EOF error at websocket.JSON.Receive()
, it looks like a timeout mechanism.
And I have search in Google, it seems websocket protocol has a ping-pong heartbeat to maintain the connection, I want to ask whether code.google.com/p/go.net/websocket
support this ping protocol or not?
What should I do if I want keep connection between client and server alive?
Upvotes: 14
Views: 21453
Reputation: 143
Here's working drop-in solution for gorilla/websocket package.
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
}
}
}()
}
Upvotes: 14
Reputation: 8594
As recently as 2013, the go.net websocket library does not support (automatic) keep-alive messages. You have two options:
Upvotes: 4