1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

WebSocket Ping-Pong Frame実践

Last updated at Posted at 2022-06-17

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?