Maison > développement back-end > Golang > Pour le client WebSocket de Golang Fiber, comment convertir le client/connexion HTTP en WebSocket ?

Pour le client WebSocket de Golang Fiber, comment convertir le client/connexion HTTP en WebSocket ?

王林
Libérer: 2024-02-14 21:06:09
avant
1338 Les gens l'ont consulté

对于 Golang Fiber 的 WebSocket 客户端,如何将 HTTP 客户端/连接转变为 WebSocket?

l'éditeur php Xinyi vous apporte des réponses aux questions sur la transformation du client WebSocket de Golang Fiber. Lors du développement avec Golang Fiber, nous devons parfois convertir le client HTTP ou la connexion en client WebSocket. Cela permet une communication bidirectionnelle entre HTTP et WebSocket sur la même connexion. Nous détaillerons ensuite comment réaliser ce processus de transformation. Avec les étapes suivantes, vous pourrez facilement développer à l'aide du client WebSocket dans Golang Fiber.

Contenu de la question

Pour des informations générales, consultez cet article récent sur stackoverflow.

Je mets en place un service WebSockets utilisant Golang Fiber comme suit :

app.Use("/ws", handler.UpgradeHandler)
    app.Get("/ws/:id", websocket.New(func(ws *websocket.Conn) {
        handler.MediaStreamHandler(ws)
    }))
Copier après la connexion

Utilisez UpgradeHandler middleware comme ceci :

func UpgradeHandler(c *fiber.Ctx) error {
    // IsWebSocketUpgrade returns true if the client
    // requested upgrade to the WebSocket protocol.
    if websocket.IsWebSocketUpgrade(c) {
        log.Info("request to open WebSockets channel")
        return c.Next()
    }
    return fiber.ErrUpgradeRequired
}
Copier après la connexion

S'attend à ce que le client HTTP du service fasse une requête HTTP GET à http://chat.acme.ai:80/ws/123etc et force le serveur Fibre à ouvrir le service WebSockets. Par exemple :

func MediaStreamHandler(c *websocket.Conn) {
    ...
    for {
        if mt, buf, err = c.ReadMessage(); err != nil {
          ...
        }
        ...
    }
Copier après la connexion

Nous y ingérons des flux jusqu'à la fermeture de WebSocket.

Question : Si un client émet une requête HTTP GET à un service Fibre pour démarrer un service WebSockets côté Fibre, comment la logique client transforme-t-elle son client HTTP en client WebSockets ?

Intuitivement, nous avons juste un socket quelque part, et la mise à niveau d'un client HTTP vers un client WebSockets consiste simplement à ajouter la bonne « colle » au client HTTP. Mais du point de vue de l'utilisation d'une solution fixe comme Java WebSockets, il n'est pas du tout clair comment transformer un client HTTP en client WebSockets.

Solution de contournement

Golang/Fiber est accidentel ici. Par définition, le protocole WebSockets initie une requête HTTP GET vers un point de terminaison de service ; lors de la prise de contact, le protocole de transport est mis à niveau de HTTP vers WebSockets. Une partie de cette mise à niveau réside dans la modification des en-têtes HTTP des requêtes et des réponses. Consultez les exemples liés au chat ci-dessous.

En-têtes de requête mis à jour :

GET /chat HTTP/1.1
  Host: server.example.com
  Upgrade: websocket
  Connection: Upgrade
  Sec-WebSocket-Key: x3JJHmbDL1EzLkh9GBhXDw==
  Sec-WebSocket-Protocol: chat, superchat
  Sec-WebSocket-Version: 13
  Origin: http://example.com
Copier après la connexion

Réponse du serveur :

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sM1YUkAGmm50PpG2HaGWk=
Sec-WebSocket-Protocol: chat
Copier après la connexion

Ces exemples sont tirés de cet article sur les WebSockets .

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal