Go で WebSocket を使用するにはどうすればよいですか?

WBOY
リリース: 2023-05-11 16:17:07
オリジナル
2330 人が閲覧しました

近年、WebSocket テクノロジーは Web 開発に不可欠な要素となっています。 WebSocket は、単一の TCP 接続を介した全二重通信用のプロトコルであり、クライアントとサーバー間の通信をよりスムーズかつ効率的にします。現在、リアルタイム チャット、オンライン ゲーム、リアルタイム データ視覚化など、多くの最新の Web アプリケーションで WebSocket テクノロジが使用されています。

Go 言語は、最新のプログラミング言語として、WebSocket テクノロジを適切にサポートします。この記事では、Go で WebSocket テクノロジーを使用する方法について詳しく説明します。

Go 言語での WebSocket の実装

WebSocket プロトコルは HTTP アップグレード プロトコルから派生したものであるため、Go 言語で WebSocket を使用するには、WebSocket を HTTP プロトコルと組み合わせる必要もあります。 Go 言語には、HTTP 関連のさまざまな機能を提供するnet/httpパッケージが組み込まれています。 Go で WebSocket を使用したい場合は、net/httpおよびgithub.com/gorilla/websocketライブラリをインポートするだけです。

次に、github.com/gorilla/websocketライブラリを使用して WebSocket を実装する方法を見てみましょう。

WebSocket サーバーの作成

Go 言語では、WebSocket サーバーを作成する方法は比較的簡単です。 HTTP サーバーを作成し、クライアントの WebSocket 接続を待機する方法を示す次のコードを直接見てみましょう。

package main import ( "fmt" "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func main() { http.HandleFunc("/ws", handleWebSocket) http.ListenAndServe(":8080", nil) } func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } defer conn.Close() for { messageType, message, err := conn.ReadMessage() if err != nil { log.Println(err) return } log.Printf("Received message: %s ", message) err = conn.WriteMessage(messageType, message) if err != nil { log.Println(err) return } log.Printf("Sent message: %s ", message) } }
ログイン後にコピー

上記のコードでは、最初にwebsocket.Upgraderオブジェクトを作成します。 , 受信 HTTP 接続を WebSocket 接続にアップグレードする役割を果たします。次に、クライアントの接続時に呼び出されるhandleWebSocket関数を作成しました。この関数は、まず受信 HTTP 接続を WebSocket 接続にアップグレードし、次にループに入り、クライアントから継続的に情報を受信し、受信した情報をクライアントに返します。このうち、conn.ReadMessage()conn.WriteMessage()は、それぞれ情報の読み取りと書き込みに使用されます。

最後に、handleWebSocket関数を/wsルートにバインドし、HTTP サーバーを起動して、クライアントが WebSocket サーバーに接続できるようにします。すべてがうまくいった場合、上記のコードを開始すると、次のような出力が表示されます。

2021/10/13 15:20:06 http: Server started at http://127.0.0.1:8080
ログイン後にコピー

これは、WebSocket サーバーが正常に作成され、クライアントがws:/ を使用できることを意味します。 / localhost:8080/wsサーバーに接続するためのアドレス。

WebSocket クライアントの作成

WebSocket サーバーの作成と同様に、WebSocket クライアントも Go 言語で簡単に作成できます。 WebSocket サーバーとの接続を確立するクライアントを作成する方法を説明する次のコードを見てみましょう。

package main import ( "fmt" "log" "net/url" "os" "os/signal" "syscall" "github.com/gorilla/websocket" ) func main() { interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"} log.Printf("Connecting to %s", u.String()) conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil) if err != nil { log.Fatal("dial:", err) } defer conn.Close() done := make(chan struct{}) go func() { defer close(done) for { messageType, message, err := conn.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("Received message: %s ", message) if err := conn.WriteMessage(messageType, message); err != nil { log.Println("write:", err) return } log.Printf("Sent message: %s ", message) } }() for { select { case <-done: return case <-interrupt: log.Println("interrupt") if err := conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")); err != nil { log.Println("write close:", err) return } select { case <-done: case <-time.After(time.Second): } return } } }
ログイン後にコピー

上記のコードでは、websocket.Dialメソッドを使用して通信します。 WebSocket を使用すると、サーバーは接続を確立します。接続が確立されると、無限ループに入り、WebSocket サーバーと常に情報を送受信します。このうち、conn.ReadMessage()conn.WriteMessage()は、情報の読み取りと書き込みに使用されます。

上記のコードでは、channelsを使用して操作が完了するのを待っていることに注意してください。interruptシグナルを受信した場合、websocket.CloseMessageメッセージをサーバーに送信して、WebSocket 接続を閉じます。

結論

この記事では、github.com/gorilla/websocketライブラリを使用して Go 言語で WebSocket を実装する方法を学びました。 WebSocket テクノロジーを使用すると、Web アプリケーションにダイナミクスとインタラクションをさらに追加でき、アプリケーションをより最新でユーザーフレンドリーにすることができます。

WebSocket テクノロジおよびそれを Go 言語で使用する方法についてご質問やコメントがある場合は、以下にメッセージを残してご意見をお聞かせください。

以上がGo で WebSocket を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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