ホームページ  >  記事  >  バックエンド開発  >  golang で Websocket を使用してデータを転送する方法

golang で Websocket を使用してデータを転送する方法

PHPz
PHPzオリジナル
2023-04-10 09:03:301773ブラウズ

近年、インターネット技術の急速な発展に伴い、Websocket 技術への注目と注目が高まっています。 Websocket は、TCP プロトコルに基づく全二重通信プロトコルであり、Web アプリケーションとサーバー間の双方向通信を可能にします。 Websocket テクノロジーを使用すると、ネットワーク遅延を削減し、データ送信効率を向上させながら、重要なリアルタイム接続を確立できます。この記事では、Websocket テクノロジーを使用して golang でデータを転送する方法を紹介します。

1. Websocket の動作原理

Websocket 通信のプロセスには 4 つのステップがあります:

1. 接続を確立します: クライアントは HTTP リクエストをサーバーに送信し、アップグレードします。 WebSocketプロトコルに接続します。

2. ハンドシェイク: サーバーはリクエストを確認し、Websocket 接続を確立します。

3. 通信: ご存知のとおり、HTTP はステートレス プロトコルであり、クライアントとサーバー間で HTTP 接続が確立されると、すぐに切断されます。したがって、このプロトコルによれば、クライアントとサーバーが通信するときは、要求メッセージと応答メッセージを送信する必要があります。ただし、Websocket プロトコルでは、クライアントは一度サーバーとの接続を確立すると、HTTP 要求および応答メッセージを複数回送信することなく、長期間の接続を維持できます。

4. 閉じる: クライアントまたはサーバーが Websocket 接続を切断します。

Websocket は HTTP プロトコルとは異なることがわかります。HTTP プロトコルは要求メッセージと応答メッセージの送信のみをサポートしますが、Websocket プロトコルはリアルタイムの双方向通信をサポートします。

2. golang での Websocket テクノロジーの使用

golang では、サードパーティ ライブラリ golang.org/x/net/websocket を使用して Websocket 通信を実装できます。 golang.org/x/net/websocket は、Websocket 通信プロトコルを簡単に実装できる golang の標準ライブラリです。

1. インストール

golang では、golang.org/x/net/websocket のインストールは非常に簡単で、コマンド ラインに次のコマンドを入力するだけです:

go get golang.org/x/net/websocket

Afterインストールが完了したら、このパッケージで提供される API を使用して WebSocket 通信機能を実装できます。

2. Websocket サーバー

以下は、golang での Websocket のサーバー コードの例です:

package main

import (
    "golang.org/x/net/websocket"
    "log"
    "net/http"
)

func echoHandler(ws *websocket.Conn) {
    if err := websocket.Message.Send(ws, "Hello, Client!"); err != nil {
        log.Fatal(err)
    }
}

func main() {
    http.Handle("/", websocket.Handler(echoHandler))
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal(err)
    }
}

上の例では、 echoHandler という名前の関数を定義しました。関数は WebSocket 接続を処理し、「Hello, Client!」というメッセージをクライアントに送信します。最後に、http パッケージの ListenAndServe 関数を使用して、Websocket サーバーを起動します。

3. Websocket クライアント

以下は、golang での Websocket のクライアント コードの例です:

package main

import (
    "fmt"
    "golang.org/x/net/websocket"
    "log"
)

func main() {
    origin := "http://localhost"
    url := "ws://localhost:8080/"
    ws, err := websocket.Dial(url, "", origin)
    if err != nil {
        log.Fatal(err)
    }
    var msg = make([]byte, 512)
    var n int
    if n, err = ws.Read(msg); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Received: %s.\n", msg[:n])
}

この例では、WebSocket.Dial 関数を使用して確立します。 WebSocket サーバーとの接続 接続し、WebSocket の Read メソッドを通じてサーバーから返されたメッセージを読み取ります。

3. Websocket データ転送の実装

複数のクライアントが Websocket サーバーとの接続を確立する場合、サーバーはクライアント間のリアルタイム通信のニーズを満たすために特定のデータ転送機能を備えている必要があります。以下は、 golang.org/x/net/websocket パッケージを使用して Websocket データ転送を実装する方法です。

package main

import (
    "golang.org/x/net/websocket"
    "log"
    "net/http"
)

// 保存所有的客户端连接
var clients []*websocket.Conn

func broadcast() {
    for {
        var data []byte
        // 从所有客户端接收数据
        for i := range clients {
            if err := websocket.Message.Receive(clients[i], &data); err != nil {
                // 如果有任何错误,则断开客户端连接
                clients[i].Close()
                log.Printf("Client %v disconnected\n", clients[i].RemoteAddr())
                // 将已关闭客户端从clients中删除
                clients = append(clients[:i], clients[i+1:]...)
                continue
            }
            // 向其他所有客户端广播数据
            for j := range clients {
                if err := websocket.Message.Send(clients[j], data); err != nil {
                    log.Printf("Unable to send message to %v: %v\n", clients[j].RemoteAddr(), err)
                }
            }
        }
    }
}

func main() {
    // 启动一个广播协程
    go broadcast()
    http.Handle("/", websocket.Handler(func(ws *websocket.Conn) {
        // 保存每个新连接
        clients = append(clients, ws)
        log.Printf("Client %v connected\n", ws.RemoteAddr())
    }))
    
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal(err)
    }
}

この例では、broadcast という名前の goroutine を使用してデータ転送関数を処理します。いずれかのクライアントが接続すると、それを他のクライアントに転送します。同時に、クライアントが切断されると、ブロードキャスト コルーチンはそのクライアントをクライアントから削除します。

要約すると、golang は優れた Websocket 実装言語であり、golang.org/x/net/websocket パッケージを使用して Websocket 通信プロトコルを簡単に実装できます。 Websocketを使用してリアルタイム通信接続を確立する場合、データ転送機能を実装することでクライアント間の即時通信を実現できます。

以上がgolang で Websocket を使用してデータを転送する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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