ホームページ >バックエンド開発 >Golang >golang Websocket 開発ガイド: 多人数オンラインコラボレーション機能の実装

golang Websocket 開発ガイド: 多人数オンラインコラボレーション機能の実装

王林
王林オリジナル
2023-12-02 12:18:581092ブラウズ

golang Websocket开发指南:实现多人在线协作功能

Golang Websocket 開発ガイド: 複数人オンラインコラボレーション機能の実装

はじめに:
Websocket は、クライアントとサーバーの間に永続的な接続を確立する方法です。サーバーがクライアントにメッセージをアクティブにプッシュする機能を実現できる通信プロトコル。実際のアプリケーションでは、Websocket はリアルタイム通知、チャット ルーム、複数人のオンライン コラボレーション、その他のシナリオで広く使用されています。この記事では、Golang を使用して Websocket アプリケーションを開発する方法を紹介し、それをコード例と組み合わせて、複数人によるオンライン コラボレーションを実装する方法を示します。

1. Golang Websocket の概要
Golang には、開発者が Websocket アプリケーションを迅速に構築できるようにするための Websocket ライブラリが組み込まれています。 Golang の Websocket ライブラリを使用すると、接続、メッセージの送受信、接続プールの管理などの Websocket 機能を簡単に実装できます。

2. Golang Websocket 開発環境の設定

  1. Golang 開発環境のインストール
  2. Golang Websocket ライブラリのインストール

    • ターミナルまたはコマンド ライン ウィンドウ
    • コマンドを実行します: go get github.com/gorilla/websocket

3. Golang Websocket 開発プロセス

  1. 必要なライブラリをインポートします。
    コードの先頭に「golang.org/x/net/websocket」ライブラリと「github.com/gorilla/websocket」ライブラリをインポートします。
  2. 接続プールの定義
    以降のサンプル コードでは、グローバル接続プールを使用してすべてのクライアントの Websocket 接続を管理し、複数人によるオンライン コラボレーションの機能を実現します。構造体タイプの接続プールを定義します。構造体のフィールドには、接続を保存するためのミューテックスとスライスが含まれます。

    type ConnPool struct {
        connLock sync.Mutex
        conns    []*websocket.Conn
    }
  3. WebSocket リクエストの処理
    Golang では、HTTP リクエストは Http パッケージを通じて監視および処理できます。 Websocket リクエストを処理する関数を作成し、その関数を HTTP サーバーに登録する必要があります。

    func wsHandler(w http.ResponseWriter, r *http.Request) {
        conn, err := websocket.Upgrade(w, r, nil, 1024, 1024)
        if err != nil {
            log.Println("websocket upgrade failed:", err)
            return
        }
    
        // 将连接添加到连接池中
        pool.add(conn)
        
        // 具体的消息处理逻辑
        go handleMessages(conn)
    }
  4. メッセージ処理ロジック
    サンプル コードでは、ゴルーチンを使用して接続ごとにメッセージの送受信を処理します。接続上のメッセージを読むことで、複数の人がオンラインで共同作業できます。新しいメッセージが送信されると、すべての接続が接続プールを通過してメッセージが送信されます。

    func handleMessages(conn *websocket.Conn) {
        for {
            message := ""
            err := conn.ReadJSON(&message)
            if err != nil {
                log.Println("read message failed:", err)
                // 从连接池中删除连接
                pool.remove(conn)
                break
            }
            
            // 遍历连接池,广播消息
            pool.broadcast(message)
        }
    }
  5. Websocket サーバーの開始
    Websocket サーバーを開始する関数を作成します。この関数では、Http サーバー インスタンスを作成し、Websocket リクエストを処理する関数をバインドする必要があります。

    func startServer() {
        http.HandleFunc("/ws", wsHandler)
        http.ListenAndServe(":8000", nil)
    }
  6. 完全なサンプル コード
    以下は完全な Websocket アプリケーションのサンプル コードです:

    package main
    
    import (
        "log"
        "net/http"
        "sync"
    
        "github.com/gorilla/websocket"
    )
    
    type ConnPool struct {
        connLock sync.Mutex
        conns    []*websocket.Conn
    }
    
    var pool ConnPool
    
    func (p *ConnPool) add(conn *websocket.Conn) {
        p.connLock.Lock()
        defer p.connLock.Unlock()
    
        p.conns = append(p.conns, conn)
    }
    
    func (p *ConnPool) remove(conn *websocket.Conn) {
        p.connLock.Lock()
        defer p.connLock.Unlock()
    
        newConns := make([]*websocket.Conn, 0, len(p.conns)-1)
        for _, c := range p.conns {
            if c != conn {
                newConns = append(newConns, c)
            }
        }
    
        p.conns = newConns
    }
    
    func (p *ConnPool) broadcast(message string) {
        p.connLock.Lock()
        defer p.connLock.Unlock()
    
        for _, conn := range p.conns {
            err := conn.WriteJSON(message)
            if err != nil {
                log.Println("write message failed:", err)
            }
        }
    }
    
    func wsHandler(w http.ResponseWriter, r *http.Request) {
        conn, err := websocket.Upgrade(w, r, nil, 1024, 1024)
        if err != nil {
            log.Println("websocket upgrade failed:", err)
            return
        }
    
        pool.add(conn)
        go handleMessages(conn)
    }
    
    func handleMessages(conn *websocket.Conn) {
        for {
            message := ""
            err := conn.ReadJSON(&message)
            if err != nil {
                log.Println("read message failed:", err)
                pool.remove(conn)
                break
            }
    
            pool.broadcast(message)
        }
    }
    
    func startServer() {
        http.HandleFunc("/ws", wsHandler)
        http.ListenAndServe(":8000", nil)
    }
    
    func main() {
        startServer()
    }

4. サンプルを実行します

  1. サンプル コードをコンパイルして実行します:

    go build main.go
    ./main
  2. ブラウザを開いて localhost:8000 にアクセスし、Websocket アプリケーション ページに入ります。
  3. このページを複数のブラウザ ウィンドウで開いて、複数人によるオンライン コラボレーションの機能をデモします。いずれかのウィンドウにメッセージを入力すると、他のウィンドウがメッセージを受信します。

結論:
この記事では、Golang を使用して Websocket アプリケーションを開発する方法を紹介し、具体的なコード例を通じて、複数人によるオンライン コラボレーションの機能を実現する方法を示します。この記事が Golang Websocket の理解と使用に役立つことを願っています。

以上がgolang Websocket 開発ガイド: 多人数オンラインコラボレーション機能の実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。