カテゴリ: 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言語を基礎からスッキリ学びたい人や、 文法だけでなく「実用的な使い方」まで押さえたい人には、 定番の入門書がこちらです。

基礎からわかるGo言語をAmazonで見る

※ Amazon広告リンク

まとめ

まとめ
まとめ

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言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導

「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。

本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。

具体的な開発内容と環境

【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。

【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。

この60分で得られる3つの理解

1. 環境構築の完全な理解

「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。

2. Go言語の基本構造(変数・型)

データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。

3. 読みやすいコードの書き方

ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。

※本講座は、将来的にバックエンドエンジニアクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。

セミナー画像

初めてのGo言語を一緒に学びましょう!

カテゴリの一覧へ
新着記事
New1
Swift
Swiftのnilとは?Optionalとの関係や初期化について初心者向けにやさしく解説!
New2
Go言語
Go言語のinit関数の役割と使い方!プログラム起動時の初期化処理
New3
Go言語
Go言語のマップの順序保証がない理由と扱い方の工夫をやさしく解説!初心者でもわかる基本知識
New4
Kotlin
Kotlinのforループの基本!範囲・配列・コレクションの繰り返し処理
人気記事
No.1
Java&Spring記事人気No1
Kotlin
Kotlinのsettings.gradleファイルを完全解説!初心者でもわかるプロジェクト設定の基本
No.2
Java&Spring記事人気No2
Go言語
Swiftの配列(Array)の使い方を完全ガイド!初心者でもわかるデータのまとめ方
No.3
Java&Spring記事人気No3
Go言語
Go言語のSQLインジェクション対策を完全解説!初心者でも安全なデータベース操作がわかる
No.4
Java&Spring記事人気No4
Swift
Swiftの高階関数map・filter・reduceを完全解説!初心者でもわかる配列操作の基本
No.5
Java&Spring記事人気No5
Go言語
Swiftの文字列操作を完全ガイド!初心者でもわかるStringの基本
No.6
Java&Spring記事人気No6
Go言語
Go言語のgo installコマンドの役割とインストール先の仕組みを徹底解説!
No.7
Java&Spring記事人気No7
Kotlin
KotlinのRoomで複雑なクエリを使いこなす!初心者でもわかる応用テクニック
No.8
Java&Spring記事人気No8
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方