WebSocketは、クライアントとサーバー間で双方向通信を行うための通信プロトコルで、軽量でリアルタイムの高いデータ通信が可能です。それでは、Golang(Go言語)でWebSocket通信を実現するために、どうしたらいいですか?本文では、Go言語のgorilla/websocketパッケージを利用して、簡単にWebSocket通信を実現する方法を皆さんに紹介します。
完全無料で使えるWebSocketテストツールのApidogを使って、WebSocket通信を簡単にテストすることが可能ですので、下記のボタンから無料で取得しましょう👇👇👇
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通信をテストする方法を皆さんに紹介します。
Apidogは、非常に強力のAPI管理ツールとして、APIの設計、ドキュメンテーション、テストなどにも対応できます。そして、HTTPだけではなく、WebSocket、gRPC、SOAPなどのプロトコルにも互換できます。それでは、Apidogというツールを使って、どのようにWebSocket 通信をテストすれば良いのでしょうか?次の詳細な操作ガイドを参照してみましょう。
ステップ⒈接続を確立する
WebSocketは、簡単なハンドシェイクプロセスを通じて接続を確立します。Apidogを使用して、アドレスバーにエンドポイントとなるURLを入力し、「接続」ボタンをクリックしてサーバーとのハンドシェイクを完了し、WebSocket接続を確立することができます。

また、認証やその他の複雑なシナリオを満たすために、パラメータ、ヘッダー、クッキーなど、ハンドシェイク中に渡す必要があるパラメータをカスタマイズすることもできます。
ステップ⒉メッセージの送受信をする
接続が確立されたら、「Message」タブの下にメッセージを書くことができます。テキスト、JSON、XML、HTML、その他のテキスト形式のメッセージを直接に書くことに加えて、バイナリ形式のメッセージはBase64または16進数を使用して書くことにも対応できます。メッセージを「送信」すると、レスポンスをすぐ取得することができます。
Apidogは、接続ステータス、送信メッセージ、受信メッセージを新着順に表示する新しいタイムラインビューを提供します。あるメッセージをクリックすると、その詳細情報を簡単に表示できます。

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

もちろん、WebSocket APIの仕様書を作成すると、それを外部チームと共有したり、ブラウザで直接表示したりすることもできます。
ステップ⒋WebSocket APIを保存する
デバッグした後、「保存」ボタンをクリックしてWebSocket APIを現在のプロジェクトに保存することができます。その後、他のチームメンバーが当該APIにアクセスしたり、デバッグしたりすることができるようになります。

まとめ
WebSocketはリアルタイムな双方向通信を可能にする技術で、チャットや株価配信などの用途に適しています。そして、Go言語ではgorilla/websocketやgin-gonic/websocketといったライブラリを利用することで簡単にWebSocket通信を実現できます。
本記事では、まずWebSocketの概要とGo言語での実装方法について解説した上、gorilla/websocketパッケージを用いた簡単なチャットアプリのサーバーサイド実装例を紹介しました。また、性格の動作を確保するために、WebSocketのテストツールであるApidogを利用してサーバーへの接続確立、メッセージ送受信、APIドキュメント作成などの一連のテスト手順も紹介しました。
以上から、Go言語はWebSocket通信を実現するのに適しており、gorilla/websocketやApidogといったツールを活用することで、開発を効率的に進められることがわかります。本記事がWebSocketを用いたアプリケーション開発の参考になれば幸いです。