You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3 Socket对接JS WebSocket时客户端握手请求无法解码问题

问题原因

你收到的非UTF-8字节流和WebSocket本身的握手协议无关,问题出在客户端使用了wss://协议:

  • wss是WebSocket over TLS的缩写,属于加密的WebSocket协议,客户端建立TCP连接后会先发起TLS握手,你收到的以\x16\x03\x01开头的字节是标准的TLS Client Hello报文,并非明文的WebSocket握手GET请求,自然无法用UTF-8解码。
  • 标准明文ws://协议的握手请求才是RFC6455规定的UTF-8编码GET请求,没有默认加密或压缩逻辑。

修复方案

方案1:使用明文WebSocket(无需加密场景)

直接修改客户端代码里的连接地址,把wss://127.0.0.1:8080改为ws://127.0.0.1:8080即可,你现有的服务端握手逻辑可以直接适配。
另外注意你现有代码里的websock_ans用了集合类型,集合是无序的,拼接HTTP响应时可能出现顺序错误,建议改为列表保证响应头顺序正确:

# 把集合改为有序列表
websock_ans = [
    'HTTP/1.1 101 Switching Protocols',
    'Upgrade: websocket',
    'Connection: Upgrade',
    'Sec-WebSocket-Accept: {key}\r\n\r\n',
]

方案2:保留TLS加密(需要wss场景)

如果你必须使用wss协议,需要给你的原生Socket套一层TLS解密层,可以用Python标准库ssl模块实现,步骤如下:

  1. 生成自签名证书(正式环境用可信CA签发的证书)
  2. 用ssl.wrap_socket包裹你的服务端Socket,加载证书配置
  3. 从加密后的Socket读取内容,拿到解密后的明文WebSocket握手请求,再走你现有握手逻辑即可。

内容的提问来源于stack exchange,提问作者k00ta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:06:03