Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Go WebSocket melaksanakan baris gilir mesej?

Bagaimanakah Go WebSocket melaksanakan baris gilir mesej?

WBOY
WBOYasal
2024-06-02 10:03:001070semak imbas

Go WebSocket melaksanakan baris gilir mesej dengan menggunakan saluran Langkah pelaksanaan adalah seperti berikut: 1. Buat saluran baris gilir mesej. 2. Mulakan goroutine untuk mendengar mesej masuk. 3. Dalam pengendali, tulis mesej ke baris gilir mesej. 4. Apabila mesej perlu dihantar, tulis mesej itu ke baris gilir. Pendekatan ini boleh digunakan untuk membina aplikasi masa nyata seperti sembang, editor kolaboratif dan kemas kini stok masa nyata.

Go WebSocket 如何实现消息队列?

How Go WebSocket melaksanakan baris gilir mesej

WebSocket ialah protokol komunikasi dupleks penuh yang boleh mewujudkan sambungan berterusan antara pelanggan dan pelayan. Ia berdasarkan TCP dan boleh digunakan untuk membina aplikasi masa nyata seperti sembang, editor kolaboratif dan kemas kini stok masa nyata.

Go menyediakan sokongan WebSocket asli, membolehkan pembangun mewujudkan dan mengurus sambungan WebSocket dengan mudah. Walau bagaimanapun, dalam aplikasi sebenar, mungkin perlu untuk melaksanakan baris gilir mesej untuk mengendalikan sejumlah besar mesej masuk dan keluar.

Melaksanakan Baris Gilir Mesej

Cara mudah untuk melaksanakan baris gilir mesej dalam Go ialah menggunakan saluran. Saluran ialah mekanisme komunikasi segerak yang membolehkan nilai ditukar dengan selamat antara coroutine serentak.

Buat saluran baris gilir mesej:

var messageQueue chan []byte

Mulakan goroutine untuk mendengar mesej masuk:

go func() {
    for message := range messageQueue {
        // 处理传入消息
    }
}()

Dalam pengendali, tulis mesej ke baris gilir mesej:

func handleConnection(conn *websocket.Conn) {
    for {
        message, err := conn.ReadMessage()
        if err != nil {
            // 处理错误
        }

        messageQueue <- message.Payload
    }
}

Apabila mesej perlu dihantar, tulis mesej untuk baris gilir:

func sendMessage(message []byte) {
    messageQueue <- message
}

Kes Praktikal

Pertimbangkan aplikasi sembang mudah di mana pelanggan dan pelayan berkomunikasi menggunakan WebSocket.

Kod pelanggan:

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()))
    }
}

Kod pelayan:

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
    }
}

Atas ialah kandungan terperinci Bagaimanakah Go WebSocket melaksanakan baris gilir mesej?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn