Heim  >  Artikel  >  Backend-Entwicklung  >  websocket: Client verwendet kein Websocket-Protokoll: „Upgrade“-Token im „Connection“-Header nicht gefunden

websocket: Client verwendet kein Websocket-Protokoll: „Upgrade“-Token im „Connection“-Header nicht gefunden

王林
王林nach vorne
2024-02-09 14:24:101218Durchsuche

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

Beim Herstellen einer WebSocket-Verbindung wird manchmal die Fehlermeldung „Client verwendet das WebSocket-Protokoll nicht: ‚Upgrade‘-Token im ‚Verbindungs‘-Header nicht gefunden“ angezeigt. Dieser Fehler wird normalerweise dadurch verursacht, dass der Client das WebSocket-Protokoll nicht korrekt verwendet. WebSocket ist ein Protokoll, das eine bidirektionale Kommunikation zwischen einem Client und einem Server ermöglicht und dabei einen speziellen Handshake-Prozess zum Herstellen einer Verbindung verwendet. Während des Handshakes muss der Client den Header „Upgrade“ ordnungsgemäß senden, um die Verwendung des WebSocket-Protokolls anzuzeigen. Wenn der Client diesen Header nicht korrekt sendet, gibt der Server den oben genannten Fehler zurück. Der PHP-Editor Baicao stellt in diesem Artikel ausführlich vor, wie Sie dieses Problem lösen können, damit Ihre WebSocket-Verbindung reibungslos funktioniert.

Frageninhalt

Ich versuche, eine Websocket-Verbindung zu einem Server herzustellen, der in Go und Javascript-Frontend geschrieben ist. Ich habe die folgenden Dateien in einem Verzeichnis:

main.go index.html

**Das ist mein Go-Code in 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))

}

Dies ist der HTML- und Javascript-Code in 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>

Wenn ich das Ding jedoch mit go run main.go starte, erhalte ich die folgende Fehlermeldung:

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

Deutsch bedeutet „Die bestehende Verbindung wird unter der Kontrolle der Host-Software beendet“

Mir fehlt etwas und mein Verständnis ist nicht tief genug, um herauszufinden, wo das Problem liegt. Jede Hilfe wird sehr geschätzt!

Ich dachte, vielleicht fehlt meinem JS-Websocket ein Upgrade, aber in Chrome sehe ich den folgenden Anforderungsheader für die Anforderungs-URL ws://localhost:9100/ws mit der Aufschrift „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

Workaround

Dank des hilfreichen Kommentars von Cerise Limón konnte ich das Problem beheben. Das Problem ist, dass ich einen Endpunkt zum Indizieren von Dateien und einen anderen für Websockets benötige. Also habe ich den relevanten Teil geändert in:

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)

}

Das obige ist der detaillierte Inhalt vonwebsocket: Client verwendet kein Websocket-Protokoll: „Upgrade“-Token im „Connection“-Header nicht gefunden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen