Maison  >  Article  >  développement back-end  >  websocket : client n'utilisant pas le protocole websocket : jeton « Mise à niveau » introuvable dans l'en-tête « Connexion »

websocket : client n'utilisant pas le protocole websocket : jeton « Mise à niveau » introuvable dans l'en-tête « Connexion »

王林
王林avant
2024-02-09 14:24:101220parcourir

websocket:客户端未使用 websocket 协议:“连接”标头中未找到“升级”令牌

Lors de l'établissement d'une connexion WebSocket, l'erreur "Client n'utilisant pas le protocole WebSocket : jeton 'Mise à niveau' introuvable dans l'en-tête 'Connexion'" apparaît parfois. Cette erreur est généralement due au fait que le client n'utilise pas correctement le protocole WebSocket. WebSocket est un protocole qui permet une communication bidirectionnelle entre un client et un serveur, en utilisant un processus d'établissement de liaison spécial pour établir une connexion. Lors de la poignée de main, le client doit envoyer correctement l'en-tête « Upgrade » pour indiquer l'utilisation du protocole WebSocket. Si le client n'envoie pas cet en-tête correctement, le serveur renverra l'erreur ci-dessus. L'éditeur PHP Baicao présentera en détail comment résoudre ce problème dans cet article afin que votre connexion WebSocket puisse se dérouler sans problème.

Contenu de la question

J'essaie d'établir une connexion Websocket à un serveur écrit en interface Go et Javascript. J'ai les fichiers suivants dans un répertoire :

main.go index.html

**Voici mon code go en main.go :**

package main


import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.upgrader{
    readbuffersize:  1024,
    writebuffersize: 1024,
}

func homepage(w http.responsewriter, r *http.request) {
    http.servefile(w, r, "./index.html")
    conn, err := upgrader.upgrade(w, r, nil)
    if err != nil {
        log.println("error in handler:", err)
        return
    }
    log.println("client connected.")

    for {
        messagetype, p, err := conn.readmessage()
        if err != nil {
            log.println("fehler in readmessage: ", err)
            return
        }

        log.println(string(p))

        //echo message to client
        if err := conn.writemessage(messagetype, p); err != nil {
            log.println(err)
            return
        }
    }
}

func setuproutes() {
    http.handlefunc("/ws", homepage)
}

func main() {
    fmt.println("server gestartet")
    setuproutes()
    log.fatal(http.listenandserve(":9100", nil))

}

Voici le html et le javascript dans index.html :

<!doctype html>
<html lang="de">
<head>
    <meta charset="utf-8">
    <title>some unimportant html </title>
</head>
<body>
    
    <script>


        let socket = new websocket("ws://localhost:9100/ws");
        console.log("websocket started.");

        socket.onopen = () => {
            console.log("client started.");
        }

        socket.onclose = (event) => {
            console.log("socket closed: ", event);
        }

        socket.onerror = (error) => {
            console.log("socket error: ", error);
        }

        socket.onmessage = (msg) => {
            console.log(msg);
        }
    </script>
</body>
</html>

Cependant, lorsque j'exécute le truc en utilisant go run main.go J'obtiens l'erreur suivante :

2022/11/20 16:38:33 http: superfluous response.writeheader call from github.com/gorilla/websocket.(*upgrader).returnerror (server.go:83)
2022/11/20 16:38:33 error in handler: websocket: the client is not using the websocket protocol: 'upgrade' token not found in 'connection' header
2022/11/20 16:38:33 error in handler: write tcp [::1]:9100->[::1]:63712: wsasend: eine bestehende verbindung wurde softwaregesteuert durch den hostcomputer abgebrochen.
2022/11/20 16:39:06 error in handler: write tcp [::1]:9100->[::1]:63733: wsasend: eine bestehende verbindung wurde softwaregesteuert durch den hostcomputer abgebrochen.
exit status 0xc000013a

L'allemand signifie "La connexion existante est terminée sous le contrôle du logiciel hôte"

Il me manque quelque chose et ma compréhension n'est pas assez approfondie pour comprendre quel est le problème. Toute aide est grandement appréciée!

Je pensais qu'il manquait peut-être une mise à niveau à mon websocket js, mais dans Chrome, je peux voir l'en-tête de requête suivant pour l'URL de la requête ws://localhost:9100/ws qui dit "upgrade:websocket"

Accept-Encoding: gzip, deflate, br
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: no-cache
Connection: Upgrade
Host: localhost:9100
Origin: http://localhost:9100
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: h3DWLuXsI9/GkTo+sIjyzw==
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36

Solution de contournement

Grâce au commentaire utile de cerise limón, j'ai pu le réparer. Le problème est que j'ai besoin d'un point de terminaison pour l'indexation des fichiers et d'un autre pour les websockets. J'ai donc changé la partie concernée par :

func websocketHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil) //conn is a websocket connection (aus http wird websocket protokoll)
    if err != nil {
        log.Println("Error in handler:", err)
        return
    }
    log.Println("Client connected.")

    
    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            log.Println("Fehler in ReadMessage: ", err)
            return
        }

        log.Println(string(p))

        //echo message to client
        if err := conn.WriteMessage(messageType, p); err != nil {
            log.Println(err)
            return
        }
    }
}

func homePage(w http.ResponseWriter, r *http.Request) {
    http.ServeFile(w, r, "./index.html")
}

func setupRoutes() {
    http.HandleFunc("/", homePage)
    http.HandleFunc("/ws", websocketHandler)

}

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