Apabila membuat sambungan WebSocket, kadangkala ralat "Pelanggan tidak menggunakan protokol WebSocket: token 'Tingkatkan' tidak ditemui dalam pengepala 'Sambungan'" akan muncul. Ralat ini biasanya disebabkan oleh klien tidak menggunakan protokol WebSocket dengan betul. WebSocket ialah protokol yang membolehkan komunikasi dua hala antara pelanggan dan pelayan, menggunakan proses jabat tangan khas untuk mewujudkan sambungan. Semasa berjabat tangan, pelanggan perlu menghantar pengepala "Naik taraf" dengan betul untuk menunjukkan penggunaan protokol WebSocket. Jika klien tidak menghantar pengepala ini dengan betul, pelayan akan mengembalikan ralat di atas. Editor PHP Baicao akan memperkenalkan secara terperinci cara menyelesaikan masalah ini dalam artikel ini supaya sambungan WebSocket anda dapat diteruskan dengan lancar.
Saya cuba mewujudkan sambungan soket web ke pelayan yang ditulis dalam go dan javascript frontend. Saya mempunyai fail berikut dalam direktori:
main.go index.html
**Ini kod pergi saya dalam 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)) }
Ini ialah html dan javascript dalam 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>
Walau bagaimanapun, apabila saya menjalankan perkara itu menggunakan go run main.go
saya mendapat ralat berikut:
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
Makna bahasa Jerman ialah "Sambungan sedia ada ditamatkan di bawah kawalan perisian hos"
Saya kehilangan sesuatu, dan pemahaman saya tidak cukup mendalam untuk mengetahui masalahnya. Sebarang bantuan amat dihargai!
Saya fikir mungkin soket web js saya tiada peningkatan, tetapi dalam chrome saya dapat melihat pengepala permintaan berikut untuk url permintaan ws://localhost:9100/ws yang mengatakan "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
Terima kasih kepada komen cerise limón yang membantu, saya dapat membetulkannya. Masalahnya ialah saya memerlukan satu titik akhir untuk mengindeks fail dan satu lagi untuk soket web. Jadi saya tukar bahagian yang berkaitan kepada:
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) }
Atas ialah kandungan terperinci websocket: Pelanggan tidak menggunakan protokol websocket: token 'Naik taraf' tidak ditemui dalam pengepala 'Sambungan'. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!