I've wrtten a websocket server in fiber
's websocket, and the client is js websocket in browser.
Some questions regarding ping
/pong
:
- Is there any default ping/pong msg between the websocket server & client?
If yes, then why I can't see it in chrome's devtools. - If there isn't any defult ping/pong msg, should I add ping/pong between server & client myself?
- If it's a good practice to add ping/pong msg myself, then:
- Is it better to send ping from client to server, or reverse?
- Since
conn.ReadJSON()
will block, does that means I should useconn.SetPingHandler()
to specify a handler, or just use the default handler?
In either case, the ping need to be sent from client to server I guess.
Sample ping from server (not sure is it proper)
I added a testing ping sent from fiber websocket server to js client, if needed:
// ping
// TODO: not sure is this needed ?
// TODO: use goroutine pool ?
if needPing {
go func() {
pingTicker := time.NewTicker(pingPeriod)
defer func() {
pingTicker.Stop()
}()
time.Sleep(pingPeriod) // wait a while before start ping,
for {
select {
case <-pingTicker.C:
conn.WriteControl(websocket.PingMessage, []byte("ping"), time.Now().Add(time.Second*5))
log.Debug("ping")
}
}
}()
}
I also don't see any ping msg on client in chrome's devtools.
It's better to use for{ select }
to handle both ping & normal msg I guess, but conn.ReadJSON()
would block the goroutine, might need to create a channel for it? Didn't try yet.
BTW, any suggestion to the ping impl?