ガイド:Go言語でWebSocket通信を実現する

WebSocketは、クライアントとサーバー間で双方向通信を行うための通信プロトコルで、軽量でリアルタイムの高いデータ通信が可能です。それでは、Golang(Go言語)でWebSocket通信を実現するために、どうしたらいいですか?本文では、Go言語のgorilla/websocketパッケージを利用して、簡単にWebSocket通信を実現する方法を皆さんに紹介します。

中村 拓也

中村 拓也

12 5月 2025

ガイド:Go言語でWebSocket通信を実現する

WebSocketは、クライアントとサーバー間で双方向通信を行うための通信プロトコルで、軽量でリアルタイムの高いデータ通信が可能です。それでは、Golang(Go言語)でWebSocket通信を実現するために、どうしたらいいですか?本文では、Go言語のgorilla/websocketパッケージを利用して、簡単にWebSocket通信を実現する方法を皆さんに紹介します。

💡
Go言語でWebSocketのサーバーを起動すると、それが正確に動作できることを確保するために、WebSocket通信をテストする必要があります。

完全無料で使えるWebSocketテストツールのApidogを使って、WebSocket通信を簡単にテストすることが可能ですので、下記のボタンから無料で取得しましょう👇👇👇
button

WebSocketとは

WebSocketはブラウザとサーバー間のリアルタイムな双方向通信を可能にする技術です。TCP接続上で全二重通信ができるため、サーバーからブラウザへリアルタイムにデータをプッシュ送信できます。HTTPと比較するとヘッダ情報が少ないので通信オーバーヘッドが小さく、高頻度のデータ送受信に適しています。一度接続すると開いたままの持続的なセッションが保持されるので、HTTPのように接続を切断する必要がありません。Webブラウザとの親和性が高くJavaScriptから簡単に利用でき、SSL/TLSによる暗号化通信もサポートしています。

これにより、チャット、株価配信、マルチプレイゲームなどリアルタイム性が重要なWebアプリケーションで活用されています。ポーリングを使うHTTP通信と比較すると効率的で、インタラクティブな通信を実現できるため、今後さらに利用が拡大していく通信技術だと言えます。

GolangでWebSocket通信を行う

それでは、GolangでWebSocket通信を実現するには、どうしたらいいですか?この部分では、よく見られる実現方法を皆さんに紹介します。

gorilla/websocketパッケージを利用

gorilla/websocketは、Go言語でWebSocket通信を実装するための最も人気と実績のあるライブラリです。主な特徴は以下の通りです:

gorilla/websocketを使うことで、Go言語で簡単にWebSocket通信を行うことができます。次は簡単なサンプルになります:

package main

import (
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        return
    }
    defer conn.Close()

    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            return
        }
        if err := conn.WriteMessage(messageType, p); err != nil {
            return
        }
    }
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

GinフレームワークのWebSocketパッケージを利用

GinはGo言語の人気のWebフレームワークです。GinでWebSocketを利用する場合、主にgin-gonic/websocketパッケージを使用します。gin-gonic/websocketパッケージでは以下のようなことができます。

また、Ginのルーティングやその他の機能とシームレスに統合できます。

Ginとgin-gonic/websocketを使うことで、シンプルかつ高パフォーマンスなWebSocketサーバーをGo言語で構築できます。次は簡単なサンプルになります。

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/", func(c *gin.Context) {
        c.HTML(200, "index.html", nil)
    })

    r.GET("/ws", func(c *gin.Context) {
        // WebSocket接続を処理
        // ...
    })

    r.Run(":8080")
}

gorilla/muxルーターを利用

gorilla/muxはGo言語のWebアプリケーション開発でよく利用されるルーターライブラリです。主な特徴は以下の通りです。

gorilla/muxはGoの標準ライブラリよりも機能面で優れているため、Go言語製のWebアプリケーションで広く利用されているルーティングライブラリです。このライブラリは、WebSocketのリクエストを処理できます。次は、簡単な実装例です。

package main

import (
    "log"
    "net/http"
    "github.com/gorilla/mux"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            return
        }
        if err := conn.WriteMessage(messageType, p); err != nil {
            return
        }
    }
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/ws", wsHandler)

    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}

GolangでWebSocketの実装例

このケースでは、1つのチャットアプリを通じて、GolangでWebSocket通信をどのように実現するのかを説明していきたいと思います。次のガイドには、プロジェクトの初期化、依存パッケージのインストール、サーバーサイドの構築などが含まれています。

プロジェクトの構造を作成

まずは、新しいディレクトリを作成して、プロジェクトのファイルを保存する必要があります:

mkdir golang-websocket-chat
cd golang-websocket-chat

Goモジュールを初期化

プロジェクトのディレクトリで、次のコマンドを利用してGoモジュールを初期化します。

go mod init golang-websocket-chat

依存パッケージをインストール

次のコマンドを利用して、gorilla/websocketをインストールすることができます:

go get github.com/gorilla/websocket

案内:もしタイムアウトになった場合、go env -w GOPROXY=https://goproxy.cnというコマンドを利用してサーバーのアドレスを指定する必要があります。

サーバーサイドの構築

main.goファイルを作成して、次のコードを書き込みます。

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            return
        }

        // クライアントが送信するメッセージをコンソールにプリント
        log.Printf("Received message: %s\n", p)

        if err := conn.WriteMessage(messageType, p); err != nil {
            log.Println(err)
            return
        }
    }
}

func main() {
    http.HandleFunc("/", wsHandler)

    log.Println("Server is running on :3000...")
    http.ListenAndServe(":3000", nil)
}

サーバーを起動

最後に、プロジェクトのルートディレクトリで、下記のコマンドを利用して、サーバーを起動します。

go run main.go

ApidogでWebSocket通信をテストする

上記の操作ガイドを参照して、Go言語でWebSocketのサーバーを起動すると、それが正確に動作できることを確保するために、WebSocket通信をテストする必要があります。次は、一番使いやすいWebSocketテストツールのApidogを使って、WebSocket通信をテストする方法を皆さんに紹介します。

button

Apidogは、非常に強力のAPI管理ツールとして、APIの設計、ドキュメンテーション、テストなどにも対応できます。そして、HTTPだけではなく、WebSocket、gRPC、SOAPなどのプロトコルにも互換できます。それでは、Apidogというツールを使って、どのようにWebSocket 通信をテストすれば良いのでしょうか?次の詳細な操作ガイドを参照してみましょう。

ステップ⒈接続を確立する

WebSocketは、簡単なハンドシェイクプロセスを通じて接続を確立します。Apidogを使用して、アドレスバーにエンドポイントとなるURLを入力し、「接続」ボタンをクリックしてサーバーとのハンドシェイクを完了し、WebSocket接続を確立することができます。

img

また、認証やその他の複雑なシナリオを満たすために、パラメータ、ヘッダー、クッキーなど、ハンドシェイク中に渡す必要があるパラメータをカスタマイズすることもできます。

ステップ⒉メッセージの送受信をする

接続が確立されたら、「Message」タブの下にメッセージを書くことができます。テキスト、JSON、XML、HTML、その他のテキスト形式のメッセージを直接に書くことに加えて、バイナリ形式のメッセージはBase64または16進数を使用して書くことにも対応できます。メッセージを「送信」すると、レスポンスをすぐ取得することができます。

Apidogは、接続ステータス、送信メッセージ、受信メッセージを新着順に表示する新しいタイムラインビューを提供します。あるメッセージをクリックすると、その詳細情報を簡単に表示できます。

ApidogでWebSocket APIの送受信をする

ステップ⒊WebSocket API仕様書を書く

Apidogの優れたドキュメンテーション機能は、WebSocket APIでも利用できます。WebSocket APIの状態、責任者、およびタグを設定し、Markdown形式で詳細な説明を入れることで仕様書を簡単に作成することができます。

ApidogでWebSocket API仕様書作成

もちろん、WebSocket APIの仕様書を作成すると、それを外部チームと共有したり、ブラウザで直接表示したりすることもできます。

ステップ⒋WebSocket APIを保存する

デバッグした後、「保存」ボタンをクリックしてWebSocket APIを現在のプロジェクトに保存することができます。その後、他のチームメンバーが当該APIにアクセスしたり、デバッグしたりすることができるようになります。

ApidogでWebSocket APIを保存
button

まとめ

WebSocketはリアルタイムな双方向通信を可能にする技術で、チャットや株価配信などの用途に適しています。そして、Go言語ではgorilla/websocketやgin-gonic/websocketといったライブラリを利用することで簡単にWebSocket通信を実現できます。

本記事では、まずWebSocketの概要とGo言語での実装方法について解説した上、gorilla/websocketパッケージを用いた簡単なチャットアプリのサーバーサイド実装例を紹介しました。また、性格の動作を確保するために、WebSocketのテストツールであるApidogを利用してサーバーへの接続確立、メッセージ送受信、APIドキュメント作成などの一連のテスト手順も紹介しました。

以上から、Go言語はWebSocket通信を実現するのに適しており、gorilla/websocketやApidogといったツールを活用することで、開発を効率的に進められることがわかります。本記事がWebSocketを用いたアプリケーション開発の参考になれば幸いです。

Explore more

n8n徹底解説:初心者でもできるローカル自動化

n8n徹底解説:初心者でもできるローカル自動化

n8nは柔軟で簡単な自動化ツール。Dockerで手軽にローカル実行でき、ITプロや初心者もAIワークフロー構築を楽しめます。

10 6月 2025

Pythonで簡単!APIデータ抽出と自動データパイプラインの作り方

Pythonで簡単!APIデータ抽出と自動データパイプラインの作り方

PythonでAPIからデータ抽出ができれば、堅牢なデータパイプライン構築が可能です。認証やエラー処理も押さえ、自動化されたプロセスを実現できます。

7 6月 2025

MindsDB: あらゆるITユーザーのための万能MCPサーバー

MindsDB: あらゆるITユーザーのための万能MCPサーバー

MindsDBは、200以上のデータソースへの接続を容易にし、AIアプリの構築やインサイトの探索をプロのように実現します。さらなるデータソースの接続や、APIdogでのAPIドキュメント化をお試しください。

26 5月 2025

ApidogでAPIデザイン中心のアプローチを取る

APIの開発と利用をよりシンプルなことにする方法を発見できる