Heim >Backend-Entwicklung >Golang >Wie hält man WebSocket-Verbindungen in Go aufrecht?

Wie hält man WebSocket-Verbindungen in Go aufrecht?

Susan Sarandon
Susan SarandonOriginal
2024-11-03 19:16:29485Durchsuche

How to Keep WebSocket Connections Alive in Go?

Aufrechterhaltung von WebSocket-Verbindungen in Go

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn