首頁  >  文章  >  後端開發  >  如何在 Go 中保持 WebSocket 連線處於活動狀態?

如何在 Go 中保持 WebSocket 連線處於活動狀態?

Barbara Streisand
Barbara Streisand原創
2024-11-02 13:26:02237瀏覽

How can I keep WebSocket connections alive in Go?

在Go 中維護WebSocket 連線

在即時通訊至關重要的Web 應用程式中,確保WebSocket 之間的連線變得至關重要即使在不活動期間,客戶端和伺服器仍保持活動狀態。在 Go 的 websocket 套件 (code.google.com/p/go.net/websocket) 的上下文中,缺乏活動可能會導致伺服器返回 EOF 錯誤,從而中斷連線。

WebSocket 心跳(乒乓)

websocket 協定包含稱為乒乓的心跳機制。這涉及從客戶端向伺服器發送 ping 訊息並從伺服器接收 pong 回應作為回報。即使沒有傳輸其他數據,定期交換這些訊息也有助於維持連線。

Go 的Websocket 套件中的支援

不幸的是,code.google.com /p/go.net/websocket 套件本身不支援ping-pong 心跳機制。因此,需要一種替代解決方案來保持連接。

自訂實作

一種方法是使用 Go 的通道和計時器來實現自訂心跳。在此解決方案中,用戶端會定期(例如每 5 秒)向伺服器發送心跳訊息。伺服器偵聽這些心跳訊息並以確認進行回應。如果伺服器在指定的逾時期限(例如 10 秒)內沒有收到心跳,則會關閉連線。

以下是如何使用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>

此自訂實作可確保客戶端和伺服器之間保持定期心跳,從而防止連線逾時。或者,還有可用於 Go 的第三方函式庫,它們為 websocket 心跳提供更高級的支持,包括處理自動重新連接和正常關閉的能力。

以上是如何在 Go 中保持 WebSocket 連線處於活動狀態?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn