websocket: Pelanggan tidak menggunakan protokol websocket: token 'Naik taraf' tidak ditemui dalam pengepala 'Sambungan'

王林
Lepaskan: 2024-02-09 14:24:10
ke hadapan
1218 orang telah melayarinya

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

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.

Kandungan soalan

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))

}
Salin selepas log masuk

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>
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

Penyelesaian

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)

}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!