Golang は、コンパイルが速く、効率的で安全なプログラミング言語であり、Web 開発でも広く使用されています。その中でも、Golang を使用して Websocket を構築することは、非常に人気のあるアプリケーション シナリオです。この記事では、Golang を使用して Websocket アプリケーションを構築する方法を紹介します。
1. Websocket とは
Websocket は、ブラウザとサーバー間の双方向通信接続の確立を可能にするプロトコルです。従来の HTTP プロトコルは、ブラウザーによってサーバーにリクエストを送信し、サーバーから応答を受信することしかできません。ただし、Websocket を使用すると、サーバーがブラウザにメッセージをアクティブに送信できるようになり、サーバーとブラウザの間で全二重通信が実現します。
2. Golang が Websocket を実装する方法
Golang には標準ライブラリ net/http
が付属しており、このパッケージは http.Server
構造体を提供します。 Web サーバーの構築に使用できます。さらに、net/http
は、WebSocket サーバーの構築に必要なすべての機能を提供する 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进行通信 }
このうち、upgrader
は websocket.Upgrader
型の変数で、そのプロパティを設定することで WebSocket 接続の処理方法を制御できます。 Upgrade
この関数はリクエストをアップグレードするときにブロックされるため、ゴルーチンで実行する必要があります。
WebSocket 接続が正常に確立されると、クライアントとサーバーの両方が *websocket.Conn## を介して通信できるようになります。 # 物体。このオブジェクトを使用して、WebSocket メッセージを送受信します。
WriteMessage メソッドを呼び出すだけです:
err := conn.WriteMessage(websocket.TextMessage, []byte("hello"))
: メッセージが到着するまで読み取りをブロックします
: ブロックして次のメッセージが到着するまで待機します
:
io.WriteCloser オブジェクトを返します。このオブジェクトを使用してメッセージを送信できます。
ReadMessage メソッドを使用します。
_, message, err := conn.ReadMessage() if err != nil { log.Println(err) return } log.Printf("recv: %s", message)
<!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 変数に保存されます。新しいメッセージが到着するたびに、サーバーはそのメッセージをすべてのクライアントにブロードキャストします。
net/http パッケージと
websocket パッケージをインポートすることだけです。標準ライブラリを直接利用し、提供されるAPIだけでWebSocketアプリケーションの開発を完了できます。この記事が Golang Websocket 開発に役立つことを願っています。
以上がGolang は WebSocket を構築しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。