見出し画像

golang Websocketの使い方と注意点について解説

今回はgolangにおけるWebsocketサーバーの使い方について解説していきます。

Websocket

Websocketは双方向通信を提供するプロトコルでリアルタイムのウェブアプリケーションで有効です。
Go言語でWebsocketを扱う際は、gorilla/websocket パッケージが使われることが多いです。
堅牢性と柔軟性に備え、Goの標準的なHTTPサーバーと簡単に統合することができます。


gorilla/websocketのインストール

まず以下のコマンドを使ってライブラリをインストールします。

go get github.com/gorilla/websocket


Websocketサーバーの使い方

HTTPハンドラーの設定

Websocket接続をアップグレードするためのハンドラーを定義します。

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

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool { return true },
}

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

    for {
        messageType, message, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            break
        }
        log.Printf("Received: %s", message)

        if err := conn.WriteMessage(messageType, message); err != nil {
            log.Println(err)
            break
        }
    }
}

websocket.Upgrader:HTTP接続をWebsocketにアップグレードするための構造体。

ReadBufferSizeWriteBufferSize:Websocketを通じてデータを読み書きする際のバッファサイズを指定します。

CheckOrigin:オリジンチェックを行う関数。
この設定ではreturn trueとしているため、すべてのオリジンからの接続を許可します。

wsHandler:Websocket通信を処理するためのハンドラー関数。
HTTPリクエストを受け取りそれをWebsocket接続にアップグレードします。

upgrader.Upgrade:HTTP接続をWebsocketプロトコルにアップグレードするメソッド。成功すればWebsocket接続を返します。

defer conn.Close():関数が終了する前にWebsocket接続を確実に閉じるための呼び出し。

conn.ReadMessage():クライアントからメッセージを受信します。messageTypeはメッセージの種類、messageは受信したデータです。

conn.WriteMessage():受信したメッセージをそのままクライアントにエコーバックします。エラーハンドリングを含め、通信エラーがある場合は接続を閉じます。


HTTPサーバーの設定

上記のハンドラーをHTTPサーバーに登録します。

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


Websocketの注意点

コネクションの管理

Websocketコネクションは手動で管理する必要があります。クライアントが接続を閉じた場合、サーバー側でもコネクションを適切に閉じることが重要です。


セキュリティ対策

セキュリティリスクを軽減するためにオリジンチェックを実装してクロスサイトリクエストを防ぎます。CheckOriginフィールドで設定します。

また、不正なデータがシステムに侵入することを防ぐために受信したデータは検証とサニタイズが必要です。


パフォーマンス考慮

大量の同時接続や高頻度のデータ交換を行うアプリケーションでは、パフォーマンスとリソース管理を慎重に設計する必要があります。


golangをもっと詳しくなりたい方に

初めてのGo言語

Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。


詳解Go言語Webアプリケーション開発

こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。

以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。


【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)

まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。
この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。


現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

この経験に学べ

この記事が気に入ったらサポートをしてみませんか?