STM32搭建WebSocket服务器时握手响应不被浏览器接受如何解决
WebSocket握手失败常见原因排查
首先验证你提供的Sec-WebSocket-Accept值计算结果正确,因此可排除核心字段计算错误的问题,可按照以下方向排查其他异常:
1. 响应报文格式不规范
- 确认最后一个响应头结束后,必须跟两个连续的
\r\n,即响应头末尾有一个空行,这是HTTP协议规定的头部分隔标识,少一个换行都会导致浏览器无法解析响应 - 检查所有响应头的拼写是否正确,没有多余空格、特殊字符,虽然HTTP头不区分大小写,但建议严格按照标准写法,避免老旧浏览器校验拦截
- 如果你计算
Sec-WebSocket-Accept时是对SHA1输出的十六进制字符串做Base64编码,属于错误实现,必须对SHA1输出的20字节原始二进制数据做Base64编码,避免后续换请求key时出错
2. TCP连接状态异常
- 确认STM32发送完握手响应后没有主动断开TCP连接,WebSocket通信复用握手阶段建立的TCP连接,一旦服务端主动断连会直接导致握手失败
- 检查TCP报文是否存在校验和错误、序号异常等问题,部分嵌入式LwIP栈配置错误时会生成校验和非法的TCP报文,浏览器会直接丢弃响应
- 确认服务端监听端口、IP与客户端请求的完全一致,请求头的Host字段如果携带端口也要和实际监听端口匹配
3. 跨域校验拦截
客户端请求头携带了Origin: http://192.168.1.61,部分浏览器会对WebSocket请求做跨域校验,你可以在响应头中添加Access-Control-Allow-Origin: http://192.168.1.61(测试时可以直接用*)规避跨域拦截
4. 嵌入式网络栈配置问题
- 检查你使用的网络栈(通常是LwIP)的发送缓冲区大小,确认完整的握手响应可以一次性发出,避免分包导致浏览器解析异常
- 确认响应报文没有被网络栈自动添加多余头字段、或者被截断内容
快速定位技巧
打开浏览器开发者工具的「控制台」标签,WebSocket握手失败时会打印明确的错误原因,比如Invalid Sec-WebSocket-Accept、Connection closed before handshake等,可以直接定位问题方向,无需先抓包分析。
内容的提问来源于stack exchange,提问作者BlackLenin
相关产品推荐
相关产品推荐

