Apidog

オールインワン協働API開発プラットフォーム

API設計

APIドキュメント

APIデバッグ

APIモック

API自動テスト

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

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

中村 拓也

中村 拓也

Updated on 5月 12, 2025

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通信を実装するための最も人気と実績のあるライブラリです。主な特徴は以下の通りです:

  • WebSocketプロトコルの全ての機能をサポートしています
  • 高速でメモリ効率の良い実装がされています
  • APIがシンプルで使いやすい設計になっています
  • テストCoverageが高く信頼性が高いライブラリです
  • 定期的に更新されており、セキュリティfix等が追加されていきます

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パッケージでは以下のようなことができます。

  • 簡単にWebSocketエンドポイントを定義できる
  • WebSocketのコネクションを取得して操作できる
  • メッセージの送受信、クローズなどの処理を行える
  • ミドルウェアと統合して拡張機能を追加できる

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

  • 同じRouterGroupでWebSocketとHTTPのルーティングを定義
  • ミドルウェアで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アプリケーション開発でよく利用されるルーターライブラリです。主な特徴は以下の通りです。

  • URLパスに基づくルーティングが簡単に定義できる
  • パラメータ化されたURLパスを簡単にマッチングできる
  • サブルーターを定義することでルーティングを階層化できる
  • ミドルウェアのコンセプトをサポートしている
  • 柔軟なURLマッチングとルーティングのルールをカスタマイズできる

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を用いたアプリケーション開発の参考になれば幸いです。

Postmanの基本的な使い方を(初心者向け)チュートリアル

Postmanの基本的な使い方を(初心者向け)

Postmanは、APIテストなどを行うための定番のツールになります。API戦略を実施する場合は、Postmanを利用することで、その効率性を大幅に向上できます。そこで、本文では、基本的なPostmanの使い方を皆さんに紹介して、Postmanを全く使ったことがないユーザーでも、本文の内容を参照して、Postmanを使いこなすことができると思います。

中村 拓也

4月 8, 2025

Clineで無料体験!Gemini 2.5 Proが今すぐ試せる方法チュートリアル

Clineで無料体験!Gemini 2.5 Proが今すぐ試せる方法

Clineを通じてGoogleのGemini 2.5 Proに無料でアクセスできることで、生産性を向上させ、複雑な問題解決に役立つ強力なAIアシスタントを提供。制約はあるものの、無料の利点は大きい。

中村 拓也

3月 28, 2025

Cloudflareで実現する高性能MCPサーバー構築ガイド:7ステップ完全解説チュートリアル

Cloudflareで実現する高性能MCPサーバー構築ガイド:7ステップ完全解説

このガイドに従えば、Cloudflareで高性能なMCPサーバーをデプロイし、拡張性、安全性、パフォーマンスを向上させることができます。すべての工程を詳細に解説します。

中村 拓也

3月 24, 2025