In einem WebSocket-Server, der mit code.google.com/p/go.net/websocket erstellt wurde, können Clients Benachrichtigungen vom Server empfangen . Client-Server-Verbindungen können jedoch aufgrund eines Timeout-Mechanismus, der durch längere Inaktivität ausgelöst wird, vorzeitig beendet werden.
Um dieses Problem zu beheben, enthält das WebSocket-Protokoll einen „Ping-Pong“-Heartbeat-Mechanismus. Dieser Mechanismus ermöglicht es sowohl dem Client als auch dem Server, sich gegenseitig Keep-Alive-Nachrichten zu senden, wodurch verhindert wird, dass die Verbindung unterbrochen wird.
Leider ist dies beim code.google.com/p/go.net/websocket-Paket nicht der Fall unterstützen dieses Ping-Pong-Protokoll nativ. Um dieses Problem zu umgehen, können Sie einen benutzerdefinierten Ping-Pong-Handler wie den folgenden implementieren:
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 } } }() }
Durch die Einbettung dieses Handlers in Ihren WebSocket-Server können Sie regelmäßig Ping-Nachrichten an den Client senden und im Gegenzug Pong-Antworten erhalten . Dadurch wird sichergestellt, dass die Verbindung auch in Zeiten der Inaktivität aktiv bleibt.
Das obige ist der detaillierte Inhalt vonWie hält man WebSocket-Verbindungen in Go aufrecht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!