カテゴリ: Go言語 更新日: 2025/11/24

Go言語でWebSocketを扱う基本!リアルタイム通信の導入例

Go言語でWebSocketを扱う基本!リアルタイム通信の導入例
Go言語でWebSocketを扱う基本!リアルタイム通信の導入例

先生と生徒の会話形式で理解しよう

生徒

「先生、Goでリアルタイムチャットを作りたいんですが、どうやって通信すればいいですか?」

先生

「その場合はWebSocketという仕組みを使うと便利です。WebSocketはサーバとブラウザが常に接続された状態でデータをやり取りできる通信方法です。」

生徒

「普通のHTTP通信とどう違うんですか?」

先生

「HTTPはリクエストを送るたびにサーバと接続しますが、WebSocketは一度接続したらその後はサーバとブラウザがずっとつながった状態でリアルタイムに情報をやり取りできます。」

1. WebSocketとは?

1. WebSocketとは?
1. WebSocketとは?

WebSocketはリアルタイム通信を可能にするプロトコルです。チャットアプリやゲーム、株価表示など、サーバから即座にデータを送信したい場合に適しています。HTTPのように毎回接続を作る必要がなく、常に通信路が開かれているイメージです。

2. GoでWebSocketを使う準備

2. GoでWebSocketを使う準備
2. GoでWebSocketを使う準備

Goではgorilla/websocketというライブラリがよく使われます。このライブラリを使うと、WebSocketの接続やデータ送受信を簡単に行えます。まずはモジュールを追加します。


go get github.com/gorilla/websocket

3. サーバ側の基本構造

3. サーバ側の基本構造
3. サーバ側の基本構造

WebSocketサーバはHTTPサーバに少しだけ処理を追加するだけです。接続リクエストを受けたらWebSocketにアップグレードして、メッセージを受け取り返すようにします。


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

var upgrader = websocket.Upgrader{}

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        return
    }
    defer conn.Close()
    for {
        _, msg, err := conn.ReadMessage()
        if err != nil {
            break
        }
        conn.WriteMessage(websocket.TextMessage, msg)
    }
}

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

4. クライアント側の接続

4. クライアント側の接続
4. クライアント側の接続

ブラウザ側ではJavaScriptを使ってWebSocketに接続します。接続後はsendでサーバにメッセージを送り、onmessageでサーバからのメッセージを受け取ります。


let ws = new WebSocket("ws://localhost:8080/ws");
ws.onmessage = function(event) {
    console.log("受信:", event.data);
};
ws.onopen = function() {
    ws.send("こんにちは、サーバ!");
};

5. 複数クライアントへの対応

5. 複数クライアントへの対応
5. 複数クライアントへの対応

複数のクライアントから接続される場合、接続ごとにconnを管理し、全員にメッセージを送信できるようにします。Goではスライスやマップで接続を保持し、ループで回して送信します。

6. 接続の安全性とエラー処理

6. 接続の安全性とエラー処理
6. 接続の安全性とエラー処理

WebSocketでもセキュリティは重要です。CORS設定を適切に行い、HTTPSで通信することで盗聴や不正接続を防ぎます。また、エラーが起きたときは接続を閉じる処理を必ず入れてください。

7. Goルーチンを使った効率的な通信

7. Goルーチンを使った効率的な通信
7. Goルーチンを使った効率的な通信

Goの強みはgoroutineによる並列処理です。WebSocketの接続ごとにgoroutineを使うことで、複数の接続を効率よく処理できます。これによりリアルタイム通信でも高いパフォーマンスを実現できます。

8. 実際のアプリでの応用例

8. 実際のアプリでの応用例
8. 実際のアプリでの応用例

チャットアプリやリアルタイム通知、オンラインゲームの状態更新などでWebSocketは活用されます。サーバとクライアントが常に接続されているので、即時性が求められる場面に最適です。

9. 開発のポイント

9. 開発のポイント
9. 開発のポイント

WebSocketの基本は接続のアップグレード、メッセージの送受信、複数接続の管理です。Goのgoroutineとgorilla/websocketを活用することで簡単に実装できます。セキュリティ面ではHTTPS、CORS、エラーハンドリングを忘れないことが重要です。

まとめ

まとめ
まとめ

Go言語でWebSocketを扱うための基本的な流れを振り返ると、リアルタイム通信が必要なアプリでは欠かせない技術であることが改めて実感できます。通常のHTTP通信では、リクエストを送るたびに接続してレスポンスを受け取るという「往復型」のやり取りになりますが、WebSocketでは接続を一度確立すれば、サーバとクライアントが一続きのパイプでつながれたような状態になり、双方向のやり取りが途切れることなく行えます。この性質が、チャットやゲーム、株価表示などの「リアルタイムで情報が更新され続ける」アプリには理想的です。

Go言語では、gorilla/websocketライブラリを使えば、複雑な処理をあまり意識せずにWebSocketサーバを構築することができます。このライブラリは多くのGo開発者に利用されており、安定性も高いことから、学習にも実務にも適しています。WebSocket接続を受け取ってアップグレードし、メッセージを読み書きする基本的なループ構造はどのアプリでもほぼ同じで、Goの強みであるgoroutineを併用することで、複数クライアントからの接続にも自然に対応できます。WebSocketの設計は「接続をどう管理するか」「どのタイミングでメッセージを送るか」という点が核になるので、今回のような基本サンプルを理解しておくと応用もスムーズです。

また、セキュリティ面の理解も欠かせません。WebSocket自体は便利ですが、HTTPと同じように適切なCORS設定やHTTPS通信が必要です。ユーザーの情報を扱う場合は特に注意しなくてはならず、ブラウザからの通信かどうか、悪意あるアクセスが混ざっていないかなどをチェックする必要があります。WebSocketは常に接続が開いたままなので、エラー処理や接続解除のタイミングを正しく実装しておくことが安定動作につながります。

実際のアプリに落とし込む場合、複数のユーザー同士でメッセージを共有するチャットアプリ、特定のイベントが発生したときに即座に通知を送るリアルタイム通知システム、ゲームのプレイヤー同士の状態共有など、さまざまな場面で活用できます。WebSocketを扱うための基礎を理解しておくことで、応用の幅が一段と広がり、実践的な機能を持つGoアプリの開発につながります。

応用しやすいWebSocketサンプルコード


// クライアントの一覧を管理する例
var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan []byte)

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

    clients[ws] = true

    for {
        _, msg, err := ws.ReadMessage()
        if err != nil {
            delete(clients, ws)
            break
        }
        broadcast <- msg
    }
}

func handleMessages() {
    for {
        msg := <-broadcast
        for client := range clients {
            client.WriteMessage(websocket.TextMessage, msg)
        }
    }
}

func main() {
    http.HandleFunc("/ws", handleConnections)
    go handleMessages()
    http.ListenAndServe(":8080", nil)
}

このコードでは、複数のクライアントからの接続を管理し、受け取ったメッセージを全員に配信するシンプルなチャットサーバを構築しています。goroutineを利用することで、handleConnectionshandleMessagesが同時に動作し、リアルタイムにメッセージが配信されます。Go言語の並行処理とWebSocketの仕組みが組み合わさることで、高速で無駄のない通信が可能になります。

先生と生徒の振り返り会話

生徒

「WebSocketって、最初は難しそうだと思っていたんですが、意外とシンプルな仕組みで動いているんですね。常に接続が保たれているのが便利だと思いました。」

先生

「そうなんですよ。HTTPとは違って一度つながったらつながりっぱなしなので、リアルタイムのやり取りには最適なんです。Goのgoroutineと組み合わせると、さらに効率がよくなります。」

生徒

「複数の人に同時にメッセージを送れるのも面白かったです。チャットアプリの仕組みが少し理解できた気がします!」

先生

「リアルタイム通信の基礎を押さえれば、通知アプリやゲームの同期など、もっと複雑なアプリにも挑戦できますよ。今回の理解を土台にして、実際に作ってみるとさらに身につきます。」

カテゴリの一覧へ
新着記事
Go言語の構造体でインターフェースを実装する方法を初心者向けにやさしく解説!
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
Go言語の文字列フォーマット!fmt.Sprintfで簡単に出力を整形する方法
Go言語のエラーと例外の違いを初心者向けに整理!わかりやすく解説
人気記事
No.1
Kotlin・Go・Swift記事の人気No1
Swiftのwhile文とrepeat while文を完全マスター!初心者にもわかる繰り返し処理の使い方と違い
No.2
Kotlin・Go・Swift記事の人気No2
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.3
Kotlin・Go・Swift記事の人気No3
Swift入門ガイド|基本構文と書き方をマスターしよう
No.4
Kotlin・Go・Swift記事の人気No4
Kotlinの正規表現(Regex)の使い方をやさしく解説!文字列操作の基本を初心者向けに学ぼう
No.5
Kotlin・Go・Swift記事の人気No5
Kotlinのwhen式を完全ガイド!初心者でもわかるパターンマッチング的な使い方
No.6
Kotlin・Go・Swift記事の人気No6
Kotlinで画面を作る!レイアウトXMLとビューの基本操作をやさしく解説
No.7
Kotlin・Go・Swift記事の人気No7
Kotlinのコンパニオンオブジェクトとは?初心者向けに使い方と役割をわかりやすく解説!
No.8
Kotlin・Go・Swift記事の人気No8
Swiftのオプショナル型とは?初心者でもわかる使い方とアンラップの基礎