カテゴリ: Go言語 更新日: 2026/09/05

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言語でWebSocket通信を実装する場合、多くの現場や学習記事で使われているのがgorilla/websocketという定番ライブラリです。標準ライブラリだけでは扱いづらいWebSocketの接続処理やメッセージ送受信を、シンプルなコードで書けるようになります。初心者でも理解しやすく、サンプルも豊富なため、最初の一歩として最適です。

まずは、このライブラリを自分のプロジェクトで使えるように準備します。Goでは「モジュール」という仕組みで外部ライブラリを管理します。ターミナルで以下のコマンドを実行すると、自動的に必要なファイルが追加されます。


go get github.com/gorilla/websocket

これでWebSocketを扱う準備は完了です。次に、実際にライブラリが使えるかを確認するため、最小限のサンプルコードを見てみましょう。


package main

import "github.com/gorilla/websocket"

func main() {
    // 今回は「使えるようになったか」を確認するだけなので、
    // 特別な処理は書いていません
    _ = websocket.Upgrader{}
}

このように、エラーなくビルドできれば準備は成功です。ここでは細かい処理を理解する必要はありません。「GoでWebSocketを使うための土台が整った」とイメージできれば十分です。

3. サーバ側の基本構造

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

WebSocketサーバは、実は特別に難しい仕組みではありません。基本は「HTTPサーバとして待ち受け、最初の接続だけHTTPで受け取り、その後の通信をWebSocketに切り替える」という流れです。 そのため、通常のWebサーバを理解していれば、少しの追加知識で実装できます。ここでは、WebSocketサーバがどのような役割を持ち、どんな処理を行っているのかを、初心者向けに順を追って確認していきます。

以下のサンプルは、クライアントから送られてきたメッセージを、そのまま送り返すだけの非常にシンプルなWebSocketサーバです。 「接続する」「受け取る」「返す」という最小限の構造に絞っているため、サーバ側の基本動作を理解するのに最適です。


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

// HTTP通信をWebSocket通信に切り替えるための設定
var upgrader = websocket.Upgrader{}

// WebSocket接続を処理する関数
func wsHandler(w http.ResponseWriter, r *http.Request) {
    // HTTP接続をWebSocketにアップグレード
    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() {
    // /ws にアクセスがあった場合に wsHandler を実行
    http.HandleFunc("/ws", wsHandler)
    http.ListenAndServe(":8080", nil)
}

このコードでは、最初にHTTPとして接続を受け付け、WebSocketに切り替えた後は、同じ接続を使って何度もメッセージの送受信を行っています。 これがサーバ側の基本構造であり、リアルタイム通信を実現する土台となります。

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を利用することで、handleConnectionsとhandleMessagesが同時に動作し、リアルタイムにメッセージが配信されます。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のrunの使い方!スコープ内で処理をまとめるテクニック
New2
Kotlin
Kotlinの文字列を逆順にするreversedの使い方を徹底解説!初心者でもわかる文字列操作入門
New3
Kotlin
KotlinのtoList・toCharArrayの使い方を徹底解説!文字列をリストに変換する方法を初心者向けにやさしく説明
New4
Kotlin
Kotlinの拡張プロパティとは?基本的な作り方と活用例を初心者向けに解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#プログラムの基本的な書き方を完全解説!初心者でもわかる文法入門ガイド
No.2
Java&Spring記事人気No2
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.3
Java&Spring記事人気No3
Swift
Swift入門ガイド|基本構文と書き方をマスターしよう
No.4
Java&Spring記事人気No4
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.5
Java&Spring記事人気No5
C#
C#の論理演算子の使い方を完全ガイド!&&・||・!を初心者でもわかりやすく解説
No.6
Java&Spring記事人気No6
Kotlin
Kotlinのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.7
Java&Spring記事人気No7
Kotlin
KotlinでZIPファイルの圧縮と解凍を実装する手順を完全解説!Kotlinファイル操作と入出力I/O入門
No.8
Java&Spring記事人気No8
Swift
Swiftでユーザー向けエラーメッセージ設計を徹底解説!iOSアプリのUI/UXで注意すべきポイント

💻 作業効率アップに

ノートPCを縦置きしてデスクを広く。
省スペースで片づく定番スタンド

UGREEN 縦型スタンドをAmazonで見る

※ Amazon広告リンク