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

Posted

技术标签:

【中文标题】客户端未使用 websocket 协议:在“连接”标头中找不到“升级”令牌【英文标题】:Client is not using the websocket protocol: 'upgrade' token not found in 'Connection' header 【发布时间】:2021-03-26 06:45:24 【问题描述】:

我正在使用 Gorilla Websocket 包来实现一个 websocket。

conn, err := upgrader.Upgrade(w, r, nil)

    if err != nil 
        // handle error
        fmt.Println(err)
    
    defer conn.Close()

我看到以下错误

websocket:

我打印在我的请求的标题上,我看到以下内容

Sec-Fetch-User ?1
Sec-Fetch-Dest document
Referer http://localhost:4747/home
Cookie myGoLiveCookie=369d99fa-901d-4b23-a64b-4731247de304
Sec-Ch-Ua "Google Chrome";v="87", " Not;A Brand";v="99", "Chromium";v="87"
Sec-Ch-Ua-Mobile ?0
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Sec-Fetch-Site same-origin
Accept-Encoding gzip, deflate, br
Upgrade-Insecure-Requests 1
Accept text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Mode navigate
Accept-Language en-GB,en-US;q=0.9,en;q=0.8
Connection keep-alive

没有按预期升级 websocket 或连接升级

我相信我面临与this one 完全相同的问题。

【问题讨论】:

由于错误消息状态和请求标头确认,客户端没有发出websocket upgrade 请求。编辑问题以描述客户如何提出请求。如果可能,包括代码。 【参考方案1】:

浏览器js请求ws连接方式错误,正确ws请求码var ws = new WebSocket("ws://localhost:4747/ws");

一个正确的ws请求头,里面的每个头都是必须的,但是值不同。

GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

【讨论】:

【参考方案2】:

错误已经到来,因为您手动调用了/ws/:roomId,此端点是从前端内部命中的。前端命中此端点后,您可以转到index.html文件并打印console.log(roomId),这将结束错误!

【讨论】:

【参考方案3】:

如果您在 VM 中部署 WS 服务器并希望此标头默认存在,请更新您的 nginx 配置文件,如下所示:

location /ws/ 
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $http_host;
        proxy_set_header Upgrade websocket;
        proxy_set_header Connection Upgrade;
        proxy_pass         "http://127.0.0.1:8089";
    

proxy_set_header 升级 websocket; proxy_set_header 连接升级; 即使客户端没有通过标头,也会为您完成这项工作。

【讨论】:

以上是关于客户端未使用 websocket 协议:在“连接”标头中找不到“升级”令牌的主要内容,如果未能解决你的问题,请参考以下文章

spring对websocket的集成和使用

游戏网络编程——WebSocket入门及实现自己的WebSocket协议

webSocket原理探索

python怎么连接websocket

websocket协议详解

Websocket 原理