インターネット技術の継続的な発展に伴い、リアルタイム接続はますます多くのアプリケーションにとって不可欠な機能になってきています。 WebSocket は、サーバーがクライアントにデータをプッシュしてリアルタイムの双方向通信を実現できる、TCP プロトコルに基づくネットワーク プロトコルです。
Go は高速かつ効率的なプログラミング言語であり、そのシンプルさと効率性により、近年最も人気のある言語の 1 つとなっています。この記事では、Go言語を使用してWebSocketサービスを実装する方法を紹介します。
WebSocket プロトコルは、クライアントとサーバー間のリアルタイム通信を可能にする、TCP プロトコルに基づく全二重通信プロトコルです。 WebSocket は、従来の HTTP リクエストおよびレスポンス モードと比較して、接続確立後の接続状態を維持できるため、リアルタイムの双方向通信を実現します。
WebSocket プロトコルのワークフローは次のとおりです。
従来の HTTP リクエストと比較した WebSocket の利点は次のとおりです。
Go は新興言語であり、そのシンプルさ、効率性、セキュリティなどの特性により、ネットワーク アプリケーションの開発に Go を使用し始めるチームが増えています。 Go には、HTTP および WebSocket サービスを実装するための API を提供する標準ライブラリ net/http があります。
WebSocket 接続を確立するには、サーバーとクライアントでそれぞれ次の操作を実行する必要があります:
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") })
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); };
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 でネットワークの中断、接続タイムアウト、サーバーのクラッシュなど、さまざまな異常な状況が発生する可能性があります。 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 サイトの他の関連記事を参照してください。