gorilla/websocketの使用
接続をアップグレードして処理します
「gorilla/websocketの使用」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
gorilla/websocketライブラリ
gorilla/websocketは、Goで最も広く使われているWebSocketライブラリです。アップグレードハンドシェイクを処理し、フレームの読み書きに使える接続オブジェクトを提供します。go get github.com/gorilla/websocketでインストールします。
import "github.com/gorilla/websocket"Upgrader
UpgraderはHTTPリクエストをWebSocket接続に変換します。バッファサイズとOriginチェックを設定します。
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}CheckOriginとセキュリティ
デフォルトでは、Upgraderは異なるオリジンからのリクエストを拒否します。開発中は制限を緩めても構いませんが、本番環境ではOriginヘッダーを検証して、クロスサイトWebSocketハイジャックを防いでください。
upgrader.CheckOrigin = func(r *http.Request) bool {
return r.Header.Get("Origin") == "https://myapp.com"
}ハンドラでのアップグレード
http.HandlerFuncの中でUpgradeを呼び出します。成功すると*websocket.Connを取得できます。
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
defer conn.Close()
// read/write loop here
}メッセージの読み取り
ReadMessageはフレームが届くまでブロックし、メッセージの種類とペイロードのバイト列を返します。
mt, data, err := conn.ReadMessage()
if err != nil {
return // client closed or error
}
fmt.Printf("got %d bytes\n", len(data))
_ = mtメッセージの書き込み
WriteMessageは指定した種類のフレームを送信します。
err := conn.WriteMessage(websocket.TextMessage, []byte("hello"))
if err != nil {
return
}エコーループ
典型的な例では、メッセージを読み取ってそのまま書き戻します。Readがエラーを返すとループは終了します(クライアントが切断した状態です)。
for {
mt, msg, err := conn.ReadMessage()
if err != nil {
break
}
conn.WriteMessage(mt, msg)
}JSONヘルパー
gorillaには、Goの値をソケット経由で直接マーシャリングするReadJSONとWriteJSONが用意されており、構造化されたメッセージに便利です。実際のソースでは、Msg structのフィールドにjson:"text"タグが付いています。
type Msg struct {
Text string // tag: json text
}
var m Msg
conn.ReadJSON(&m)
conn.WriteJSON(Msg{Text: "ack"})リーダー1つ、ライター1つのルール
重要な点として、1つの接続で同時に実行できるリーダーは1つ、ライターも1つだけです。複数のgoroutineから書き込む場合はmutexで保護するか、1つのgoroutineに書き込みを集約してください(ブロードキャストのレッスンで扱います)。
ルートの登録
通常のHTTPルートと同じようにハンドラを接続します。クライアントはws://host/wsに接続します。
http.HandleFunc("/ws", wsHandler)
http.ListenAndServe(":8080", nil)実行例:JSONの往復処理の例え
WebSocketのコードには外部ライブラリが必要です。この標準ライブラリのスニペットでは、受信したメッセージをmapにアンマーシャリングし、応答をマーシャリングすることで、ReadJSON/WriteJSONと同じ処理を再現しています。
package main
import (
"encoding/json"
"fmt"
)
func main() {
in := []byte("{\"text\":\"ping\"}")
var m map[string]string
json.Unmarshal(in, &m)
reply, _ := json.Marshal(map[string]string{"text": m["text"] + "-ack"})
fmt.Println(string(reply))
}理解度チェック
gorilla/websocketの使い方について理解度を確認しましょう。
まとめ
gorilla/websocketの使い方を学びました。
Upgraderがハンドシェイクを実行します。CheckOriginを検証してくださいUpgradeは*websocket.Connを返しますReadMessage/WriteMessageまたはJSONヘルパーを使います- 1つの接続につき、同時にリーダーとライターを1つずつにします
AI チューターと学ぶ Go — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「gorilla/websocketの使用」レッスンは無料ですか?
はい。「gorilla/websocketの使用」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「gorilla/websocketの使用」で何を学びますか?
接続をアップグレードして処理します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「gorilla/websocketの使用」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- WebSocketの基礎
- gorilla/websocketの使用
- メッセージのブロードキャスト
- 接続管理