Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Go WebSocket melaksanakan komunikasi dua hala?

Bagaimanakah Go WebSocket melaksanakan komunikasi dua hala?

WBOY
WBOYasal
2024-06-05 21:38:001118semak imbas

Bahasa Go mempunyai sokongan terbina dalam untuk WebSocket, yang boleh mencapai komunikasi dua hala melalui langkah berikut: Cipta pelayan WebSocket: Cipta fungsi pengendali HTTP. Buat struktur Penaik taraf untuk menaik taraf permintaan HTTP. Mulakan pelayan WebSocket. Buat klien WebSocket: Buat permintaan HTTP dan tetapkan pengepala WebSocket. Buat struktur Dialer. Gunakan kaedah Dail untuk mewujudkan sambungan.

Go WebSocket 如何实现双向通信?

Go WebSocket: Mendayakan komunikasi dua hala

WebSocket ialah protokol komunikasi dua hala yang membenarkan pertukaran data masa nyata antara pelanggan dan pelayan melalui satu sambungan TCP berterusan. Bahasa Go menyediakan pembangun dengan sokongan terbina dalam untuk WebSocket, menjadikan komunikasi dua hala mudah dan mudah.

Mencipta pelayan WebSocket

Mencipta pelayan WebSocket memerlukan tiga langkah:

  1. Gunakan pakej net/http untuk mencipta fungsi http.Handler, yang mana mengendalikan sambungan WebSocket. net/http 包创建 http.Handler 函数,该函数处理 WebSocket 连接。
  2. 创建 websocket.Upgrader 结构体,该结构体将 HTTP 请求升级为 WebSocket 连接。
  3. 使用 http.ServeHTTP 方法启动 WebSocket 服务端。
package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

func main() {
    // HTTP 处理程序
    handler := func(w http.ResponseWriter, r *http.Request) {
        upgrader := websocket.Upgrader{}
        conn, err := upgrader.Upgrade(w, r, nil)
        if err != nil {
            log.Fatal(err)
        }
        defer conn.Close()

        for {
            messageType, message, err := conn.ReadMessage()
            if err != nil {
                log.Fatal(err)
            }
            if messageType == websocket.CloseMessage {
                log.Println("Client closed connection")
                return
            }
            log.Printf("Received from client: %s", string(message))
            err = conn.WriteMessage(messageType, []byte("Echoed: "+string(message)))
            if err != nil {
                log.Fatal(err)
            }
        }
    }

    // 启动 WebSocket 服务端
    http.HandleFunc("/websocket", handler)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal(err)
    }
}

创建 WebSocket 客户端

创建 WebSocket 客户端同样需要三步:

  1. 使用 net/http 包创建 http.Request,并设置 "Upgrade: WebSocket" 头。
  2. 创建 websocket.Dialer 结构体,该结构体用于建立 WebSocket 连接。
  3. 使用 Dial
  4. Buat struktur websocket.Upgrader, yang meningkatkan permintaan HTTP kepada sambungan WebSocket.

Gunakan kaedah http.ServeHTTP untuk memulakan pelayan WebSocket.

🎜
package main

import (
    "fmt"
    "log"

    "github.com/gorilla/websocket"
)

func main() {
    dialers := websocket.Dialer{
        ReadBufferSize:  1024,
        WriteBufferSize: 1024,
    }

    conn, _, err := dialers.Dial("ws://localhost:8080/websocket", nil)
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    for i := 0; i < 10; i++ {
        message := fmt.Sprintf("Hello from client %d", i)
        err := conn.WriteMessage(websocket.TextMessage, []byte(message))
        if err != nil {
            log.Fatal(err)
        }

        _, message, err = conn.ReadMessage()
        if err != nil {
            log.Fatal(err)
        }
        log.Printf("Received echo: %s", string(message))
    }
}
🎜🎜Mencipta klien WebSocket🎜🎜🎜Mencipta klien WebSocket juga memerlukan tiga langkah: 🎜🎜🎜Gunakan pakej net/http untuk mencipta http.Request dan tetapkan pengepala "Upgrade: WebSocket". 🎜🎜Buat struktur websocket.Dialer, yang digunakan untuk mewujudkan sambungan WebSocket. 🎜🎜Gunakan kaedah Dail untuk mewujudkan sambungan. 🎜🎜rrreee🎜Dengan langkah ini, anda boleh melaksanakan komunikasi dua hala WebSocket dengan mudah dalam Go, menambahkan keupayaan interaksi masa nyata pada aplikasi anda. 🎜

Atas ialah kandungan terperinci Bagaimanakah Go WebSocket melaksanakan komunikasi dua hala?. 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