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件の返信
コメントは受け付けていません。