WebSocket Ping-Pong Frame 実践
inspire
mdnからWebSocketの規格を見ていたところ、Ping-Pong Frameの実装についてサーバー側からする必要があると記載を見たのでGoから実装しました。
レファランス
使うライブラリ
- gorilla >= 1.5.0
- golang >= 1.18
gorillaのAPIレファランス
Ping Frameは直接転送し、Pong FrameはPongHandlerを設定することで、Ping-Pong Frameが実装できます。
ソースコード
サーバー側
- クライアントと接続が完了したところからのソースコードになります。
ping Frameの実装
一定間隔でPingを送信したいので、タイマーを使います。
ticker := time.NewTicker(pingPeriod)
defer func() {
ticker.Stop()
c.conn.Close()
}()
タイマーのトリガーが起動されたらPingメッセージを送信します。
case <-ticker.C:
log.Println("ping")
log.Println(time.Now())
c.conn.SetWriteDeadline(time.Now().Add(writeWait))
if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil {
return
}
}
pong Frameの実装
クライアントからのPong Frameを受け取る側の実装になります。
ブラウザからはPingFrameを受け取った際に自動的にPing Frameを転送してますので、クライアント側の実装は不要です。
PongHandlerに受け取った際のイベントハンドラーを登録し、届いたPong Frameを確認します。
c.conn.SetPongHandler(func(string) error {
c.conn.SetReadDeadline(time.Now().Add(pongWait))
log.Println("print line", time.Now())
return nil
})
終わり
ここからもう少し応用すると、クライアント、サーバー間の遅延時間を計算することも可能になります。
今回使ったソースコードは下記のURLにありますので確認いただければと思います。