0
Help us understand the problem. What are the problem?

posted at

updated at

WebSocket Ping-Pong Frame実践

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にありますので確認いただければと思います。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?