Go 言語 Websocket 開発: 多数の同時接続を処理する方法
Go 言語 Websocket 開発: 多数の同時接続を処理する方法
Websocket は、ブラウザとブラウザの間に永続的な接続を確立する全二重通信プロトコルです。これにより、サーバーがクライアントにメッセージをアクティブに送信できるようになり、クライアントもこの接続を通じてサーバーにメッセージを送信できます。 Websocket は、リアルタイム性と効率性の高さにより、リアルタイム通信、インスタント チャット、その他のシナリオで広く使用されています。
ただし、実際のアプリケーションでは、多くの場合、多数の同時接続を処理する必要があります。開発プロセスでは、安定した信頼性の高いサービスを提供するために、サーバーの処理能力を最適化する方法を検討する必要があります。以下では、Go 言語を使用して WebSocket プログラムを開発する方法を紹介し、それを具体的なコード例と組み合わせて、多数の同時接続を処理する方法を示します。
まず、Websocket 接続を処理するには、Go 言語の標準ライブラリの net/http
および github.com/gorilla/websocket
パッケージを使用する必要があります。次に、接続リクエストを処理する handler
関数を作成し、その中にメッセージ送受信ロジックを実装します。
package main import ( "log" "net/http" "github.com/gorilla/websocket" ) // 声明一个全局的websocket的upgrader var upgrader = websocket.Upgrader{} func main() { http.HandleFunc("/ws", handleWS) err := http.ListenAndServe(":8000", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } } func handleWS(w http.ResponseWriter, r *http.Request) { // 将HTTP连接升级为Websocket连接 conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("Upgrade error: ", err) return } defer conn.Close() for { // 读取客户端发送的消息 _, msg, err := conn.ReadMessage() if err != nil { log.Println("Read error: ", err) break } // 处理收到的消息 handleMessage(msg) // 向客户端发送消息 err = conn.WriteMessage(websocket.TextMessage, []byte("Server received: "+string(msg))) if err != nil { log.Println("Write error: ", err) break } } } func handleMessage(message []byte) { log.Println("Received message: ", string(message)) // TODO: 处理消息逻辑 }
上記のコードでは、まずグローバル upgrader
オブジェクトを作成して、HTTP 接続を Websocket 接続にアップグレードします。 handleWS
関数では、upgrader.Upgrade
メソッドを使用して HTTP 接続を Websocket 接続にアップグレードし、conn.ReadMessage# を通じてクライアントによって送信されたメッセージを読み取ります。 ##、次に、
handleMessage を呼び出してメッセージ ロジックを処理し、
conn.WriteMessage を通じてメッセージをクライアントに送信します。
goutine と
channel が用意されており、各接続を処理するための
handleWS 関数内に
goutine を作成できます。このようにして、各接続は相互に影響を与えることなく、独立した
goroutine で実行できます。
func main() { http.HandleFunc("/ws", handleWS) err := http.ListenAndServe(":8000", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } } func handleWS(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("Upgrade error: ", err) return } defer conn.Close() go func() { for { _, msg, err := conn.ReadMessage() if err != nil { log.Println("Read error: ", err) break } handleMessage(msg) err = conn.WriteMessage(websocket.TextMessage, []byte("Server received: "+string(msg))) if err != nil { log.Println("Write error: ", err) break } } }() }
go func() を使用して匿名関数を
goroutine として作成します。この関数では、各接続のメッセージの読み取りと送信が行われます。処理されたロジックです。このようにして、各接続を独立した
goroutine で実行して、同時処理の効果を実現できます。
channel を使用して同時接続の数を制限することもできます。バッファーを使用して
channel を作成し、メイン スレッドで新しい接続が受け入れられたときに、対応する
groutin に渡すことができます。接続数が特定のしきい値に達すると、新しい接続は接続はブロックされます。接続が閉じられると、新しい接続を受け入れることができるように、
channel からその接続を削除できます。
func main() { http.HandleFunc("/ws", handleWS) err := http.ListenAndServe(":8000", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } } func handleWS(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("Upgrade error: ", err) return } defer conn.Close() // 将连接传递给一个channel处理 connections <- conn go func(conn *websocket.Conn) { for { _, msg, err := conn.ReadMessage() if err != nil { log.Println("Read error: ", err) break } handleMessage(msg) err = conn.WriteMessage(websocket.TextMessage, []byte("Server received: "+string(msg))) if err != nil { log.Println("Write error: ", err) break } } }(conn) } var ( maxConnections = 100 connections = make(chan *websocket.Conn, maxConnections) ) func main() { http.HandleFunc("/ws", handleWS) go handleConnections() err := http.ListenAndServe(":8000", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } } func handleConnections() { for conn := range connections { // 当连接数达到maxConnections时,新连接将会被阻塞 log.Println("New connection accepted!") go handleWS(conn) } }
connections チャネルを作成し、そのサイズを
maxConnections に設定します。
handleWS 関数では、接続を
connections チャネルに渡し、接続のメッセージ送受信ロジックを処理する
goroutine を作成します。
handleConnections 関数では、
for conn := rangeconnections を使用して新しい接続を受信し、それらを処理するための対応する
ゴルーチンを作成します。
goutine と
channel を使用して、接続処理タスクを複数の
goutine に分散して処理し、パフォーマンスを向上させることができます。サーバーの同時処理機能。
goutine と
channel## を使用して効率的な同時処理を実現できます。 # 、多数の同時接続を処理するニーズを満たすため。合理的なコード設計と適切な最適化戦略を通じて、Websocket サービスに安定した信頼性の高いサポートを提供できます。 (注: 上記のコードは単なる例であり、特定のアプリケーション シナリオではさらなる最適化と改善が必要になる場合があります)
以上がGo 言語 Websocket 開発: 多数の同時接続を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Golang はフロントエンドとして使用できます。Golang は、フロントエンド アプリケーションなど、さまざまなタイプのアプリケーションの開発に使用できる非常に多用途なプログラミング言語です。Golang を使用してフロントエンドを作成することで、 JavaScript などの言語によって引き起こされる一連の問題、たとえば、型安全性の低さ、パフォーマンスの低下、コードの保守の困難などの問題です。

Golang はデスクトップ プログラムの作成には適していません。その機能は C# や C++ ほどスムーズで強力ではありません。また、Go の GUI ライブラリは C# や C/C++ ほど使いやすくありません。この問題は次のとおりです。結局のところ、Go はデスクトップ プログラムの開発に使用され、需要が増加しています。

Golangは高級言語であり、より自然言語や数式に近いプログラミングであり、基本的にマシンのハードウェアシステムから切り離され、人間にとって理解しやすい形でプログラムを書くように設計されています。大規模システムの開発プロセスにおける現実的な問題を解決し、同時実行性をサポートし、統一された仕様、シンプルでエレガント、そして強力なパフォーマンスを実現します。その主な目標は、「Python などの動的言語の開発スピードとパフォーマンスとセキュリティの両方を兼ね備えること」です。 C/C++などのコンパイル言語の。」

golang キーワードは 25 個あり、1. Break、2.default、3.func、4.interface、5.select、6.case、7.chan、8.const、9. continue、10.defer、11. go; 12. マップ; 13. 構造体; 14. else; 15. goto; 16. パッケージ; 17. スイッチ; 18. フォールスルーなど

Go 言語 Websocket 開発: 多数の同時接続を処理する方法 Websocket は全二重通信プロトコルであり、ブラウザとサーバーの間に永続的な接続を確立し、サーバーがクライアントにメッセージをアクティブに送信できるようにし、クライアントは接続はサーバーにメッセージを送信します。 Websocket は、リアルタイム性と効率性の高さにより、リアルタイム通信、インスタント チャット、その他のシナリオで広く使用されています。ただし、実際のアプリケーションでは、多くの場合、多数の同時接続を処理する必要があります。開発過程で

Go は、多くの便利な組み込みライブラリを備えた高速プログラミング言語です。実際の開発作業では日時の処理が重要です。 Go は強力な時刻と日付の処理関数を提供し、開発者が時刻と日付を簡単に計算して処理できるようにします。この記事では、Go での時刻と日付の使い方を紹介します。時刻と日付の基本 Go では、時刻と日付は time.Time 型の変数で表されます。このタイプには、年、月、日、時、分、秒、タイムゾーンなどの情報が含まれます。これを作成する通常の方法は、ti を呼び出すことです。

golang で利用可能なフロントエンド フレームワーク: 1. React、再利用性の高いコードを作成し、複数のアプリケーションで使用するために Golang と組み合わせて使用; 2. JavaScript ファイルにコンパイルして Golang に埋め込むことができる Vue; 3. AngularJS と併用Golang は、効率的で応答性の高い単一ページ アプリケーションを構築する機能を提供します。4. ブートストラップは、Golang と併用して最新の柔軟な Web アプリケーションを構築します。

メッセージ キューは一般的なシステム アーキテクチャ パターンであり、高い同時実行性と非同期タスク処理を処理する上で非常に重要な役割を果たします。 Go 言語では、いくつかのオープンソース メッセージ キュー ライブラリとツールを通じて、メッセージ キューの使用が非常に便利かつ簡単になりました。この記事では、次のような Go でのメッセージ キューの使用方法を紹介します。 メッセージ キューについて 一般的なメッセージ キュー Go でメッセージ キューを使用する利点と適用可能なシナリオ Go 言語のメッセージ キュー ライブラリは、例を通して Go でメッセージ キューを使用する方法を示します。メッセージ キューの使用メッセージ キューについてメッセージ キュー
