This commit is contained in:
crusader 2017-07-12 21:57:03 +09:00
parent 6e4ca0dd5c
commit 1d480c52cd

View File

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