在使用code.google.com/p/go.net/websocket 建置的WebSocket 伺服器中,客戶端可以接收來自伺服器的通知。然而,由於長時間不活動觸發的逾時機制,客戶端與伺服器的連線可能會提前終止。
為了解決這個問題,WebSocket 協定包含了「乒乓」心跳機制。這種機制允許客戶端和伺服器相互發送 keep-alive 訊息,防止連線被中斷。
不幸的是,code.google.com/p/go.net/websocket 套件沒有原生支援此乒乓協定。作為一種解決方法,可以實現如下所示的自訂ping-pong 處理程序:
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 } } }() }
透過將此處理程序嵌入到WebSocket 伺服器中,您可以定期向客戶端發送ping 訊息並接收pong 響應作為回報。這可以確保即使在不活動期間連線也保持活動狀態。
以上是如何在 Go 中保持 WebSocket 連線處於活動狀態?的詳細內容。更多資訊請關注PHP中文網其他相關文章!