ホームページ  >  記事  >  バックエンド開発  >  Golang WebSocket プログラミング ガイド: 高性能リアルタイム アプリケーションの構築

Golang WebSocket プログラミング ガイド: 高性能リアルタイム アプリケーションの構築

王林
王林オリジナル
2023-12-18 09:51:391191ブラウズ

golang WebSocket编程指南:构建高性能的实时应用

Golang WebSocket プログラミング ガイド: 高性能リアルタイム アプリケーションの構築

はじめに:
インターネットの急速な発展に伴い、リアルタイム アプリケーションの必要性が高まっています。コミュニケーションはますます緊急性を増しています。双方向通信プロトコルとして、WebSocket はブラウザとサーバーの間に永続的な接続を確立でき、リアルタイム アプリケーションに効率的で信頼性の高いソリューションを提供します。この記事では、Golang を使用して高性能リアルタイム アプリケーションを構築する方法と、具体的なコード例を紹介します。

1. WebSocket プロトコルとは何ですか?
WebSocket プロトコルは、ブラウザとサーバーの間に永続的な全二重接続を確立し、サーバーがブラウザとアクティブに通信できるようにする TCP ベースのプロトコルです。 . データをプッシュしてリアルタイム通信を実現します。従来の HTTP プロトコルと比較して、WebSocket プロトコルには次の利点があります。

  1. HTTP プロトコルと比較して、WebSocket プロトコルのハンドシェイク プロセスは単純であり、接続確立の遅延が軽減されます。
  2. WebSocket プロトコルは、接続内で双方向にデータを送信できるため、データ送信のオーバーヘッドが軽減されます。
  3. WebSocket プロトコルはクロスドメイン通信をサポートしており、異なるドメイン名で接続を確立してデータの共有と交換を実現できます。

2. Golang での WebSocket プログラミング
Golang は高性能プログラミング言語として、WebSocket 通信を処理するための便利で使いやすい標準ライブラリを提供します。以下は、単純な WebSocket サーバーのサンプル コードです。

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

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

func main() {
    http.HandleFunc("/echo", echoHandler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func echoHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal("upgrade error:", err)
    }
    defer conn.Close()

    for {
        messageType, message, err := conn.ReadMessage()
        if err != nil {
            log.Println("read error:", err)
            break
        }
        log.Println("receive:", string(message))

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

上記のコードでは、WebSocket リクエストは、http.HandleFunc 関数とルート / を介して # にマップされます。 echo ##echoHandler関数。 echoHandler 関数では、websocket.Upgrader を使用して HTTP 接続を WebSocket 接続にアップグレードし、websocket.Conn インスタンスを取得します。 conn からメッセージを読み取り、同じメッセージを書き込むことで、単純な WebSocket Echo サーバーを実装しました。

3. リアルタイム チャット ルームの例

上記の例では、単純なメッセージ エコー機能のみを実装しています。以下では、Golang を使用して、複数のユーザーが同時にリアルタイムでコミュニケーションできるリアルタイム チャット ルームを構築する方法を示します。

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

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

type Message struct {
    Username string `json:"username"`
    Content  string `json:"content"`
}

type Room struct {
    clients  map[*websocket.Conn]bool
    broadcast chan Message
    join     chan *websocket.Conn
    leave    chan *websocket.Conn
}

func (r *Room) start() {
    for {
        select {
        case conn := <-r.join:
            r.clients[conn] = true
        case conn := <-r.leave:
            delete(r.clients, conn)
            close(conn)
        case message := <-r.broadcast:
            for conn := range r.clients {
                err := conn.WriteJSON(message)
                if err != nil {
                    log.Println("write error:", err)
                    delete(r.clients, conn)
                    close(conn)
                }
            }
        }
    }
}

func main() {
    r := Room{
        clients:  make(map[*websocket.Conn]bool),
        broadcast: make(chan Message),
        join:     make(chan *websocket.Conn),
        leave:    make(chan *websocket.Conn),
    }

    go r.start()

    http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
        conn, err := upgrader.Upgrade(w, r, nil)
        if err != nil {
            log.Fatal("upgrade error:", err)
        }

        r.join <- conn

        defer func() {
            r.leave <- conn
        }()

        for {
            var message Message
            err = conn.ReadJSON(&message)
            if err != nil {
                log.Println("read error:", err)
                break
            }

            r.broadcast <- message
        }
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}

上記のコードでは、接続されたクライアントを管理するための

Room タイプを定義します。 Room タイプには、接続されているすべてのクライアントを保存する clients、メッセージをブロードキャストする broadcastjoin および leave が内部的に含まれています。クライアントの接続と切断を処理するために使用されます。

main 関数では、Room インスタンスを作成し、go r.start() ## を通じて Room# を開始します。メッセージ処理コルーチンをインスタンス化します。 http.HandleFunc 関数を介して WebSocket リクエストを匿名関数にマップし、/ws をルーティングします。匿名関数では、Roomjoin チャネルへの接続に参加し、関数の最後に ## の leave から接続を終了します。 #Room がチャンネルから削除されました。同時に、conn.ReadJSONconn.WriteJSON を使用して、それぞれ JSON 形式でメッセージの読み取りと書き込みを行います。 結論:この記事では、WebSocket プロトコルの特徴と Golang での使用方法を紹介することで、高パフォーマンスのリアルタイム アプリケーションを構築するためのガイドを提供します。具体的なコード例を提供することで、読者は Golang WebSocket プログラミングをすぐに開始し、プロジェクトにリアルタイム通信機能を適用できます。この記事がお役に立てば幸いです!

以上がGolang WebSocket プログラミング ガイド: 高性能リアルタイム アプリケーションの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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