ホームページ  >  記事  >  バックエンド開発  >  Golang は WebSocket を構築します

Golang は WebSocket を構築します

WBOY
WBOYオリジナル
2023-05-22 19:21:071688ブラウズ

Golang は、コンパイルが速く、効率的で安全なプログラミング言語であり、Web 開発でも広く使用されています。その中でも、Golang を使用して Websocket を構築することは、非常に人気のあるアプリケーション シナリオです。この記事では、Golang を使用して Websocket アプリケーションを構築する方法を紹介します。

1. Websocket とは

Websocket は、ブラウザとサーバー間の双方向通信接続の確立を可能にするプロトコルです。従来の HTTP プロトコルは、ブラウザーによってサーバーにリクエストを送信し、サーバーから応答を受信することしかできません。ただし、Websocket を使用すると、サーバーがブラウザにメッセージをアクティブに送信できるようになり、サーバーとブラウザの間で全二重通信が実現します。

2. Golang が Websocket を実装する方法

Golang には標準ライブラリ net/http が付属しており、このパッケージは http.Server 構造体を提供します。 Web サーバーの構築に使用できます。さらに、net/http は、WebSocket サーバーの構築に必要なすべての機能を提供する websocket サブパッケージも提供します。

  1. WebSocket 接続の確立

WebSocket 接続を確立するには、クライアントは HTTP リクエストをサーバーに送信し、リクエストが以下であることを示す Upgrade ヘッダーを送信する必要があります。 WebSocket プロトコルにアップグレードされました。このリクエストを受信した後、サーバーは Upgrade ヘッダーを確認し、それが WebSocket リクエストであるかどうかに応じて処理する必要があります。

サーバーは、websocket.IsWebSocketUpgrade 関数を使用してリクエストが WebSocket リクエストであるかどうかを確認し、websocket.Upgrade 関数を使用してリクエストをアップグレードできます。アップグレードが成功すると、サーバーは *websocket.Conn 型の接続オブジェクトを通じてクライアントと通信できるようになります。

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()
    // 使用conn进行通信
}

このうち、upgraderwebsocket.Upgrader 型の変数で、そのプロパティを設定することで WebSocket 接続の処理方法を制御できます。 Upgradeこの関数はリクエストをアップグレードするときにブロックされるため、ゴルーチンで実行する必要があります。

  1. WebSocket メッセージの送受信

WebSocket 接続が正常に確立されると、クライアントとサーバーの両方が *websocket.Conn## を介して通信できるようになります。 # 物体。このオブジェクトを使用して、WebSocket メッセージを送受信します。

メッセージの送信は非常に簡単です。

WriteMessage メソッドを呼び出すだけです:

err := conn.WriteMessage(websocket.TextMessage, []byte("hello"))

メッセージを受信するには 3 つの方法があります:

  • ReadMessage: メッセージが到着するまで読み取りをブロックします
  • NextReader: ブロックして次のメッセージが到着するまで待機します
  • NextWriter: io.WriteCloser オブジェクトを返します。このオブジェクトを使用してメッセージを送信できます。
通常、WebSocket メッセージを受信するには

ReadMessage メソッドを使用します。

_, message, err := conn.ReadMessage()
if err != nil {
    log.Println(err)
    return
}
log.Printf("recv: %s", message)

3. 1 つの単純な WebSocket アプリケーション

この例では、単純なチャット ルーム アプリケーションを作成します。クライアントがメッセージを送信した後、サーバーは接続されているすべてのクライアントにメッセージをブロードキャストします。

クライアント側コード: (JavaScript を使用)

<!DOCTYPE html>
<html>
<head>
    <title>Chatroom</title>
</head>
<body>
    <input type="text" id="input-message"/>
    <button onclick="sendMessage()">发送</button>
    <ul id="message-list"></ul>

    <script>
        var ws = new WebSocket("ws://localhost:8080/ws");
        ws.onmessage = function(event) {
            var message = event.data;
            var li = document.createElement("li");
            li.appendChild(document.createTextNode(message));
            document.getElementById("message-list").appendChild(li);
        };

        function sendMessage() {
            var message = document.getElementById("input-message").value;
            ws.send(message);
        }
    </script>
</body>
</html>

サーバー側コード:

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{}

func main() {
    http.HandleFunc("/ws", wsHandler)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

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 {
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            break
        }
        fmt.Printf("recv: %s
", message)

        // 广播给所有客户端
        for _, conn := range conns {
            err := conn.WriteMessage(websocket.TextMessage, message)
            if err != nil {
                log.Println(err)
                break
            }
        }
    }
}

上記のコードでは、接続されているすべての

websocket.Conn を接続します。オブジェクトは conns 変数に保存されます。新しいメッセージが到着するたびに、サーバーはそのメッセージをすべてのクライアントにブロードキャストします。

概要

Golang を使用して WebSocket アプリケーションを構築するのは非常に簡単です。必要なのは、

net/http パッケージと websocket パッケージをインポートすることだけです。標準ライブラリを直接利用し、提供されるAPIだけでWebSocketアプリケーションの開発を完了できます。この記事が Golang Websocket 開発に役立つことを願っています。

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

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