カテゴリ: Go言語 更新日: 2026/04/13

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

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

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

生徒

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

先生

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

生徒

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

先生

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

1. WebSocketとは?

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

WebSocketは、ブラウザとサーバが常につながったままデータをやり取りできるリアルタイム通信の仕組みです。チャットアプリやオンラインゲーム、株価や通知の即時表示など、「サーバから今すぐ情報を届けたい」場面でよく使われます。HTTP通信のように、送信のたびに接続と切断を繰り返す必要がなく、一度つながると専用の通信路が開き続けるイメージです。

たとえばチャットでは、相手がメッセージを送った瞬間に画面へ表示したいですよね。WebSocketなら、サーバ側から待ち時間なくデータを送れるため、画面更新がとてもスムーズになります。仕組み自体は難しくなく、「最初に接続して、その後はメッセージを送り合う」と考えると初心者でも理解しやすいです。


【通信のイメージ】
ブラウザ:接続します!
サーバ :OK、これからずっとつながります
ブラウザ:メッセージ送信
サーバ :すぐに受信して返答

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
Kotlin
Kotlinのデリゲーション(byキーワード)の使い方とは?初心者向けにやさしく解説!
New2
Kotlin
Kotlinで定数を定義する方法!変更されない変数の書き方と命名ルール
New3
Kotlin
Kotlinの高階関数とは?関数を引数に渡す基本的な仕組み
New4
Kotlin
Kotlinのthis・superキーワードとは?意味と使い分けを初心者向けにわかりやすく解説
人気記事
No.1
Java&Spring記事人気No1
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.2
Java&Spring記事人気No2
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.3
Java&Spring記事人気No3
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.4
Java&Spring記事人気No4
Go言語
Go言語の複数モジュールプロジェクト構成を完全解説!初心者でもわかるモジュール管理
No.5
Java&Spring記事人気No5
Kotlin
Kotlinでテキスト表示・編集!初心者でもわかるTextViewとEditTextの使い方
No.6
Java&Spring記事人気No6
Kotlin
Kotlin Multiplatformライブラリの活用例と導入方法を初心者向けに解説!Android・iOS・Webを1つのコードで開発
No.7
Java&Spring記事人気No7
Kotlin
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
No.8
Java&Spring記事人気No8
Kotlin
Kotlinのthis・superキーワードとは?意味と使い分けを初心者向けにわかりやすく解説