Go言語でWebSocketを扱う基本!リアルタイム通信の導入例
生徒
「先生、Goでリアルタイムチャットを作りたいんですが、どうやって通信すればいいですか?」
先生
「その場合はWebSocketという仕組みを使うと便利です。WebSocketはサーバとブラウザが常に接続された状態でデータをやり取りできる通信方法です。」
生徒
「普通のHTTP通信とどう違うんですか?」
先生
「HTTPはリクエストを送るたびにサーバと接続しますが、WebSocketは一度接続したらその後はサーバとブラウザがずっとつながった状態でリアルタイムに情報をやり取りできます。」
1. WebSocketとは?
WebSocketはリアルタイム通信を可能にするプロトコルです。チャットアプリやゲーム、株価表示など、サーバから即座にデータを送信したい場合に適しています。HTTPのように毎回接続を作る必要がなく、常に通信路が開かれているイメージです。
2. GoでWebSocketを使う準備
Goではgorilla/websocketというライブラリがよく使われます。このライブラリを使うと、WebSocketの接続やデータ送受信を簡単に行えます。まずはモジュールを追加します。
go get github.com/gorilla/websocket
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. クライアント側の接続
ブラウザ側では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. 複数クライアントへの対応
複数のクライアントから接続される場合、接続ごとにconnを管理し、全員にメッセージを送信できるようにします。Goではスライスやマップで接続を保持し、ループで回して送信します。
6. 接続の安全性とエラー処理
WebSocketでもセキュリティは重要です。CORS設定を適切に行い、HTTPSで通信することで盗聴や不正接続を防ぎます。また、エラーが起きたときは接続を閉じる処理を必ず入れてください。
7. Goルーチンを使った効率的な通信
Goの強みはgoroutineによる並列処理です。WebSocketの接続ごとにgoroutineを使うことで、複数の接続を効率よく処理できます。これによりリアルタイム通信でも高いパフォーマンスを実現できます。
8. 実際のアプリでの応用例
チャットアプリやリアルタイム通知、オンラインゲームの状態更新などでWebSocketは活用されます。サーバとクライアントが常に接続されているので、即時性が求められる場面に最適です。
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を利用することで、handleConnectionsとhandleMessagesが同時に動作し、リアルタイムにメッセージが配信されます。Go言語の並行処理とWebSocketの仕組みが組み合わさることで、高速で無駄のない通信が可能になります。
生徒
「WebSocketって、最初は難しそうだと思っていたんですが、意外とシンプルな仕組みで動いているんですね。常に接続が保たれているのが便利だと思いました。」
先生
「そうなんですよ。HTTPとは違って一度つながったらつながりっぱなしなので、リアルタイムのやり取りには最適なんです。Goのgoroutineと組み合わせると、さらに効率がよくなります。」
生徒
「複数の人に同時にメッセージを送れるのも面白かったです。チャットアプリの仕組みが少し理解できた気がします!」
先生
「リアルタイム通信の基礎を押さえれば、通知アプリやゲームの同期など、もっと複雑なアプリにも挑戦できますよ。今回の理解を土台にして、実際に作ってみるとさらに身につきます。」
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!