diff --git a/websocket/client.go b/websocket/client.go index 867ee28..d6861bf 100644 --- a/websocket/client.go +++ b/websocket/client.go @@ -3,7 +3,6 @@ package websocket import ( "fmt" "log" - "net" "net/http" "sync" "time" @@ -118,11 +117,10 @@ func (c *client) On(event string, cb OnFunc) { } func (c *client) initialize() error { - c.startPingPong() + c.startPing() } func (c *client) destroy() error { - c.stopPingPong() c.status = DISCONNECTED for i := range c.onDisconnectListeners { @@ -132,39 +130,25 @@ func (c *client) destroy() error { return c.conn.Close() } -func (c *client) startPingPong() { - c.conn.SetPingHandler(func(message string) error { - err := c.conn.WriteControl(gWebsocket.PongMessage, []byte("pong"), time.Now().Add(c.server.options.PongTimeout)) - if err == gWebsocket.ErrCloseSent { - return nil - } else if e, ok := err.(net.Error); ok && e.Temporary() { - return nil - } - return err - }) - +func (c *client) startPing() { c.pingTicker = time.NewTicker(c.server.options.PingPeriod) go func() { + defer c.pingTicker.Stop() for { <-c.pingTicker.C - err := c.conn.WriteControl(gWebsocket.PingMessage, []byte("ping"), time.Now().Add(c.server.options.PingTimeout)) - if err == gWebsocket.ErrCloseSent { - } else if e, ok := err.(net.Error); ok && e.Temporary() { + if err := c.conn.WriteControl(gWebsocket.PingMessage, []byte{}, time.Now().Add(c.server.options.PingTimeout)); err != nil { + log.Println("ping:", err) } } }() } -func (c *client) stopPingPong() { - c.pingTicker.Stop() -} - func (c *client) startReading() { hasReadTimeout := c.server.options.ReadTimeout > 0 c.conn.SetReadLimit(c.server.options.MaxMessageSize) c.conn.SetPongHandler(func(message string) error { if hasReadTimeout { - c.conn.SetReadDeadline(time.Now().Add(c.server.options.ReadTimeout)) + c.conn.SetReadDeadline(time.Now().Add(c.server.options.PongTimeout)) } return nil