Maison  >  Article  >  développement back-end  >  Comment maintenir les connexions WebSocket actives dans Go ?

Comment maintenir les connexions WebSocket actives dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-03 19:16:29398parcourir

How to Keep WebSocket Connections Alive in Go?

Maintenir les connexions WebSocket dans Go

Dans un serveur WebSocket créé à l'aide de code.google.com/p/go.net/websocket, les clients peuvent recevoir des notifications du serveur . Cependant, les connexions client-serveur peuvent se terminer prématurément en raison d'un mécanisme de délai d'attente déclenché par une inactivité prolongée.

Pour résoudre ce problème, le protocole WebSocket inclut un mécanisme de battement de cœur « ping-pong ». Ce mécanisme permet au client et au serveur de s'envoyer des messages de maintien, empêchant ainsi la connexion de s'interrompre.

Malheureusement, le package code.google.com/p/go.net/websocket ne le fait pas. supporte nativement ce protocole de ping-pong. Pour contourner ce problème, vous pouvez implémenter un gestionnaire de ping-pong personnalisé comme celui-ci :

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
            }
        }
    }()
}

En intégrant ce gestionnaire dans votre serveur WebSocket, vous pouvez envoyer des messages ping périodiques au client et recevoir des réponses pong en retour. . Cela garantit que la connexion reste active même pendant les périodes d'inactivité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn