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 ?

王林
王林avant
2024-02-14 21:06:091296parcourir

对于 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)
    }))

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
}

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 {
          ...
        }
        ...
    }

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

Réponse du serveur :

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sM1YUkAGmm50PpG2HaGWk=
Sec-WebSocket-Protocol: chat

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer