Go Academy · レッスン

gorilla/websocketの使用

接続をアップグレードして処理します

レッスン 2/413 ステップ

「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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. WebSocketの基礎
  2. gorilla/websocketの使用
  3. メッセージのブロードキャスト
  4. 接続管理
← Go Academyに戻る