ホームページ > バックエンド開発 > Golang > Golang は WebSocket を実装します

Golang は WebSocket を実装します

王林
リリース: 2023-05-22 14:45:08
オリジナル
2436 人が閲覧しました

インターネット技術の継続的な発展に伴い、リアルタイム接続はますます多くのアプリケーションにとって不可欠な機能になってきています。 WebSocket は、サーバーがクライアントにデータをプッシュしてリアルタイムの双方向通信を実現できる、TCP プロトコルに基づくネットワーク プロトコルです。

Go は高速かつ効率的なプログラミング言語であり、そのシンプルさと効率性により、近年最も人気のある言語の 1 つとなっています。この記事では、Go言語を使用してWebSocketサービスを実装する方法を紹介します。

WebSocket とは

WebSocket プロトコルは、クライアントとサーバー間のリアルタイム通信を可能にする、TCP プロトコルに基づく全二重通信プロトコルです。 WebSocket は、従来の HTTP リクエストおよびレスポンス モードと比較して、接続確立後の接続状態を維持できるため、リアルタイムの双方向通信を実現します。

WebSocket プロトコルのワークフローは次のとおりです。

  1. クライアントは WebSocket 接続リクエストを開始します。
  2. サーバーはリクエストを受信した後、ハンドシェイク プロトコルを実行し、WebSocket 接続が使用できることを確認します。
  3. WebSocket 接続が確立されると、クライアントとサーバーはリアルタイムの双方向通信を行うことができます。
  4. サーバーがクライアントにデータを送信する必要がある場合、データをクライアントに直接送信することも、その逆も可能です。

従来の HTTP リクエストと比較した WebSocket の利点は次のとおりです。

  1. リアルタイムの双方向通信。オンライン ゲーム、リアルタイム チャット、オンライン ビデオに適しています。およびその他のリアルタイム アプリケーション アプリケーション シナリオ。
  2. リクエストとレスポンスが減少し、ネットワーク帯域幅の消費が削減され、データ伝送効率が向上します。

Go は WebSocket を実装します

Go は新興言語であり、そのシンプルさ、効率性、セキュリティなどの特性により、ネットワーク アプリケーションの開発に Go を使用し始めるチームが増えています。 Go には、HTTP および WebSocket サービスを実装するための API を提供する標準ライブラリ net/http があります。

WebSocket 接続の確立

WebSocket 接続を確立するには、サーバーとクライアントでそれぞれ次の操作を実行する必要があります:

サーバー

  1. HTTP サービスを作成し、http.HandleFunc 関数を使用してルーターを登録し、対応するルーティング処理関数が WebSocket 通信を実行できるようにします。
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // 判断是否支持 WebSocket,如果支持则进入 WebSocket 通信处理函数。
    if websocket.IsWebSocketUpgrade(r) {
        websocket.Handler(handleWebSocket).ServeHTTP(w, r)
        return
    }

    http.ServeFile(w, r, "index.html")
})
ログイン後にコピー
  1. WebSocket通信処理関数でコネクション確立操作を行います。
func handleWebSocket(conn *websocket.Conn) {
    defer conn.Close()

    // 输出日志信息,表示已经建立连接。
    log.Println("WebSocket connected")

    for {
        // 读取客户端发送过来的消息。
        _, msg, err := conn.ReadMessage()
        if err != nil {
            log.Println("Read error:", err)
            return
        }

        // 输出日志信息,表示接收到客户端发送的消息。
        log.Printf("Received: %s
", msg)

        // 处理完毕后,发送消息。
        err = conn.WriteMessage(websocket.TextMessage, msg)
        if err != nil {
            log.Println("Write error:", err)
            return
        }
    }
}
ログイン後にコピー

クライアント

クライアントでは、JavaScript コードを使用して WebSocket 接続を操作する必要があります。具体的なコードは次のとおりです。

var socket = new WebSocket("ws://127.0.0.1:8080/");

socket.onopen = function() {
  console.log("WebSocket connected");
};

socket.onmessage = function(event) {
  console.log("Received: " + event.data);
};

socket.onclose = function(event) {
  console.log("WebSocket closed");
};

socket.onerror = function(event) {
  console.log("WebSocket error: " + event.data);
};
ログイン後にコピー

Send message

WebSocket 接続が確立されると、サーバーとクライアントはリアルタイムの双方向通信を行うことができます。サーバーは conn.WriteMessage 関数を通じてクライアントにメッセージを送信でき、クライアントは socket.send 関数を通じてサーバーにメッセージを送信できます。

クライアントからメッセージを送信する:

socket.send("Hello world");
ログイン後にコピー

サーバー上でメッセージを受信して​​処理する:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}

log.Printf("Received: %s
", msg)
ログイン後にコピー

サーバーからメッセージを送信する:

err = conn.WriteMessage(websocket.TextMessage, []byte("Hello world"))
if err != nil {
    log.Println("Write error:", err)
    return
}
ログイン後にコピー

クライアント上でメッセージを受信して​​処理します。

socket.onmessage = function(event) {
    console.log("Received: " + event.data);
};
ログイン後にコピー

WebSocket エラー処理

実際の開発では、WebSocket でネットワークの中断、接続タイムアウト、サーバーのクラッシュなど、さまざまな異常な状況が発生する可能性があります。 Go では、エラー処理を通じてこれらの例外を処理できます。

サーバーでは、defer ステートメントを使用して、WebSocket 接続を閉じるなど、リソースを解放できます。

defer conn.Close()
ログイン後にコピー

同時に、WebSocket 通信処理関数のプロセス中に、発生する可能性のあるエラーを前処理する必要があります。例:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}
ログイン後にコピー

クライアントでは、onerror イベントを通じて WebSocket エラーを処理できます。例:

socket.onerror = function(event) {
    console.log("WebSocket error: " + event.data);
};
ログイン後にコピー

概要

この記事では、次のようなことを紹介します。 Go 言語を使用して WebSocket 接続の確立、メッセージの送信、例外処理などを含む WebSocket サービスを実装する方法。 WebSocket プロトコルはリアルタイムの双方向通信方法を提供し、オンライン ゲーム、リアルタイム チャット、オンライン ビデオなどのリアルタイム アプリケーション シナリオで使用できます。 Go では、標準ライブラリ net/http が提供する API を使用して、WebSocket サービスを簡単に実装できます。

以上がGolang は WebSocket を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート