Go WebSocket はチャネルを使用してメッセージ キューを実装します。実装手順は次のとおりです。 1. メッセージ キュー チャネルを作成します。 2. 受信メッセージをリッスンするゴルーチンを開始します。 3. ハンドラーで、メッセージをメッセージ キューに書き込みます。 4. メッセージを送信する必要がある場合は、メッセージをキューに書き込みます。このアプローチは、チャット、共同編集者、リアルタイムの株式更新などのリアルタイム アプリケーションを構築するために使用できます。
Go WebSocket がメッセージキューを実装する方法
WebSocket は、クライアントとサーバーの間に継続的な接続を確立できる全二重通信プロトコルです。これは TCP に基づいており、チャット、共同エディター、リアルタイムの株式更新などのリアルタイム アプリケーションの構築に使用できます。
Go はネイティブ WebSocket サポートを提供し、開発者が WebSocket 接続を簡単に確立および管理できるようにします。ただし、実際のアプリケーションでは、大量の送受信メッセージを処理するためにメッセージ キューを実装する必要がある場合があります。
メッセージ キューの実装
Go でメッセージ キューを実装する簡単な方法は、チャネルを使用することです。チャネルは、同時コルーチン間で値を安全に交換できるようにする同期通信メカニズムです。
メッセージキューチャネルを作成します:
var messageQueue chan []byte
受信メッセージをリッスンするゴルーチンを開始します:
go func() { for message := range messageQueue { // 处理传入消息 } }()
ハンドラーで、メッセージをメッセージキューに書き込みます:
func handleConnection(conn *websocket.Conn) { for { message, err := conn.ReadMessage() if err != nil { // 处理错误 } messageQueue <- message.Payload } }
メッセージを送信する必要がある場合、メッセージを次のように書き込みます。キュー:
func sendMessage(message []byte) { messageQueue <- message }
実際的なケース
クライアントとサーバーが WebSocket を使用して通信する単純なチャット アプリケーションを考えてみましょう。
クライアントコード:
package main import ( "context" "flag" "fmt" "log" "github.com/gorilla/websocket" ) var addr = flag.String("addr", "localhost:8080", "http service address") func main() { flag.Parse() // 连接到服务器 conn, _, err := websocket.DefaultDialer.DialContext(context.Background(), "ws://"+*addr, nil) if err != nil { log.Fatal("Could not connect to server", err) } // 读取来自服务器的消息 go func() { for { _, message, err := conn.ReadMessage() if err != nil { log.Println("Could not read message:", err) return } fmt.Println(string(message)) } }() // 发送消息到服务器 scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { conn.WriteMessage(websocket.TextMessage, []byte(scanner.Text())) } }
サーバーコード:
package main import ( "context" "flag" "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } var addr = flag.String("addr", ":8080", "http service address") var messageQueue chan []byte func main() { flag.Parse() messageQueue = make(chan []byte) // 启动消息队列监听器 go func() { for message := range messageQueue { // 处理消息 } }() // 处理 WebSocket 连接 http.HandleFunc("/ws", wsHandler) log.Fatal(http.ListenAndServe(*addr, nil)) } func wsHandler(w http.ResponseWriter, r *http.Request) { // 升级到 WebSocket 连接 conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("Could not upgrade", err) http.Error(w, "Could not upgrade", http.StatusInternalServerError) return } // 处理连接 go handleConnection(conn) } func handleConnection(conn *websocket.Conn) { for { // 读取消息 _, message, err := conn.ReadMessage() if err != nil { log.Println("Could not read message:", err) return } // 存储消息到队列 messageQueue <- message } }
以上がGo WebSocket はメッセージ キューをどのように実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。