返回顶部
首页 > 资讯 > 精选 >websocket:客户端未使用 websocket 协议:“连接”标头中未找到“升级”令牌
  • 772
分享到

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

2024-02-09 14:02:22 772人浏览 泡泡鱼
摘要

在进行 websocket 连接时,有时候会出现“客户端未使用 WEBSocket 协议:“连接”标头中未找到“升级”令牌”的错误。这个错误通常是由于客户端没有正确地使用 WebSoc

在进行 websocket 连接时,有时候会出现“客户端未使用 WEBSocket 协议:“连接”标头中未找到“升级”令牌”的错误。这个错误通常是由于客户端没有正确地使用 WebSocket 协议导致的。WebSocket 是一种在客户端和服务器之间实现双向通信的协议,它使用了一种特殊的握手过程来建立连接。在握手过程中,客户端需要正确地发送“升级”标头来表明使用 WebSocket 协议。如果客户端未正确发送该标头,服务器就会返回上述错误。PHP小编百草将在本文中详细介绍如何解决这个问题,让您的 WebSocket 连接顺利进行。

问题内容

我正在尝试与用 Gojavascript 前端编写的服务器建立 websocket 连接。我在一个目录中有以下文件:

main.go 索引.html

**这是我在 main.go 中的 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))

}

这是index.html中的html和javascript:




    
    some unimportant html 


    
    

但是,当我使用 go run main.go 运行该东西时 我收到以下错误:

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

德文的意思是“现有的连接是由主机软件控制终止的”

我遗漏了一些东西,而且我的理解不够深入,无法找出问题所在。非常感谢任何帮助!

我想也许我的 js websocket 缺少升级,但在 chrome 中我可以看到请求 url ws://localhost:9100/ws 的以下请求标头,上面写着“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

解决方法

感谢 cerise limón 的有用评论,我得以修复它。问题是我需要一个用于索引文件的端点,另一个用于 websocket 的端点。所以我将相关部分更改为:

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)

}

以上就是websocket:客户端未使用 websocket 协议:“连接”标头中未找到“升级”令牌的详细内容,更多请关注编程网其它相关文章!

--结束END--

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

本文链接: https://lsjlt.com/news/562611.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作