Heim >Backend-Entwicklung >Golang >websocket: Client verwendet kein Websocket-Protokoll: „Upgrade'-Token im „Connection'-Header nicht gefunden
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.
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
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!