Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengekalkan Sambungan WebSocket Hidup dalam Go?

Bagaimana untuk Mengekalkan Sambungan WebSocket Hidup dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-11-03 19:16:29351semak imbas

How to Keep WebSocket Connections Alive in Go?

Mengekalkan Sambungan WebSocket dalam Go

Dalam pelayan WebSocket yang dibina menggunakan code.google.com/p/go.net/websocket, pelanggan boleh menerima pemberitahuan daripada pelayan . Walau bagaimanapun, sambungan pelanggan-pelayan mungkin ditamatkan lebih awal disebabkan oleh mekanisme tamat masa yang dicetuskan oleh ketidakaktifan yang berpanjangan.

Untuk menangani isu ini, protokol WebSocket termasuk mekanisme degupan jantung "ping-pong". Mekanisme ini membolehkan kedua-dua pelanggan dan pelayan menghantar mesej kekal hidup antara satu sama lain, menghalang sambungan daripada terputus.

Malangnya, pakej code.google.com/p/go.net/websocket tidak menyokong protokol ping-pong ini secara asli. Sebagai penyelesaian, seseorang boleh melaksanakan pengendali ping-pong tersuai seperti berikut:

import (
    "time"

    "github.com/gorilla/websocket"
)

func keepAlive(c *websocket.Conn, timeout time.Duration) {
    lastResponse := time.Now()
    c.SetPongHandler(func(msg string) error {
        lastResponse = time.Now()
        return nil
    })

    go func() {
        for {
            err := c.WriteMessage(websocket.PingMessage, []byte("keepalive"))
            if err != nil {
                return
            }

            time.Sleep(timeout / 2)
            if time.Since(lastResponse) > timeout {
                c.Close()
                return
            }
        }
    }()
}

Dengan membenamkan pengendali ini dalam pelayan WebSocket anda, anda boleh menghantar mesej ping berkala kepada pelanggan dan menerima balasan pong sebagai balasan . Ini memastikan sambungan kekal aktif walaupun dalam tempoh tidak aktif.

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Sambungan WebSocket Hidup dalam Go?. 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