ing
This commit is contained in:
parent
6e4ca0dd5c
commit
1d480c52cd
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user