Golangでwebsocketの実装

websocket自体はRFCで規定されているものですが、実装はそれぞれの言語ごとに存在します。

サンプルは、

https://zenn.dev/empenguin/articles/bcf95c19451020

元を辿ると、おそらくこちら。

https://echo.labstack.com/cookbook/websocket/

他の言語の例に漏れず、クライアント側のJavaScriptとサーバー側のGoのスクリプトが連携して動作します。ディレクトリ構成は以下の通りです。

<main.goのリクエスト処理部分>

func handleWebSocket(c echo.Context) error {
	websocket.Handler(func(ws *websocket.Conn) {
		defer ws.Close()

		// 初回のメッセージを送信
		err := websocket.Message.Send(ws, "Server: Hello, Client!")
		if err != nil {
			c.Logger().Error(err)
		}

		for {
			// Client からのメッセージを読み込む
			msg := ""
			err = websocket.Message.Receive(ws, &msg)
			if err != nil {
				//c.Logger().Error(err)
			}

			// Client からのメッセージを元に返すメッセージを作成し送信する
			err := websocket.Message.Send(ws, fmt.Sprintf("Server: \"%s\" received!", msg))
			if err != nil {
				//c.Logger().Error(err)
			}
		}
	}).ServeHTTP(c.Response(), c.Request())
	return nil
}

最初のページリクエスト後はwebsocketのループに入るので、ここでページのリロード(複数回ルートのリクエスト)をするとループ処理(for loop)でエラーが発生します。

一点疑問はwebsocketのポート番号指定をどこでやっているのかわからないこと。

P.S. 2023/4/15

ポートはHTTPと同じポートが使われています。WSはHTTPとは異なるプロトコルなので同じポートでも問題はないようですね。

 

admin

“Golangでwebsocketの実装” への1件の返信

コメントは受け付けていません。