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.
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
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!