Bagaimanakah saya boleh mengekalkan sambungan WebSocket dalam Go?

Barbara Streisand
Lepaskan: 2024-11-02 13:26:02
asal
297 orang telah melayarinya

How can I keep WebSocket connections alive in Go?

Mengekalkan Sambungan WebSocket Alive in Go

Dalam aplikasi web di mana komunikasi masa nyata adalah penting, ia menjadi penting untuk memastikan bahawa sambungan antara klien dan pelayan kekal aktif, walaupun semasa tempoh tidak aktif. Dalam konteks pakej websocket Go (code.google.com/p/go.net/websocket), kekurangan aktiviti ini boleh menyebabkan pelayan mengembalikan ralat EOF, mengganggu sambungan.

WebSocket Heartbeat (Ping-Pong)

Protokol websocket termasuk mekanisme degupan jantung yang dikenali sebagai ping-pong. Ini melibatkan penghantaran mesej ping daripada klien ke pelayan dan menerima balasan pong daripada pelayan sebagai balasan. Pertukaran tetap mesej ini membantu mengekalkan sambungan hidup walaupun tiada data lain dipindahkan.

Sokongan dalam Pakej Websocket Go

Malangnya, code.google.com Pakej /p/go.net/websocket tidak menyokong mekanisme degupan jantung ping-pong secara asli. Oleh itu, penyelesaian alternatif diperlukan untuk memastikan sambungan terus hidup.

Pelaksanaan Tersuai

Satu pendekatan ialah melaksanakan degupan jantung tersuai menggunakan saluran dan pemasa Go. Dalam penyelesaian ini, pelanggan menghantar mesej degupan jantung kepada pelayan pada selang masa yang tetap (cth., setiap 5 saat). Pelayan mendengar mesej degupan jantung ini dan membalas dengan pengakuan. Jika pelayan tidak menerima degupan jantung dalam tempoh tamat masa yang ditentukan (cth., 10 saat), ia akan menutup sambungan.

Berikut ialah contoh cara pelaksanaan degupan jantung tersuai sedemikian boleh dicapai menggunakan goroutine:

<code class="go">func startHeartbeat(ws *websocket.Conn, timeout time.Duration) {
    heartbeatTicker := time.NewTicker(timeout)
    defer heartbeatTicker.Stop()

    go func() {
        for {
            select {
            case <-heartbeatTicker.C:
                ws.WriteMessage(websocket.PingMessage, []byte("heartbeat"))
            }
        }
    }()
}

// Server-side:
func handleConnection(ws *websocket.Conn) {
    startHeartbeat(ws, time.Second*10)
    for {
        _, _, err := ws.ReadMessage()
        if err != nil {
            ws.Close()
            break
        }
        // Handle incoming data ...
    }
}</code>
Salin selepas log masuk

Pelaksanaan tersuai ini memastikan degupan jantung tetap dikekalkan antara pelanggan dan pelayan, menghalang sambungan daripada tamat masa. Sebagai alternatif, terdapat perpustakaan pihak ketiga yang tersedia untuk Go yang menyediakan sokongan yang lebih maju untuk degupan jantung soket web, termasuk keupayaan untuk mengendalikan penyambungan semula automatik dan penutupan yang anggun.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengekalkan sambungan WebSocket dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan