当前位置: 首页 > news >正文

【bug】websocket协议不兼容导致的一个奇怪问题

最近在开发一个基于websocket的实时语音转文字小工具【就是这个】,出现了一个奇怪的现象:

前端代码

import { io } from 'socket.io-client';...await this.connectWebSocket();...connectWebSocket() {return new Promise((resolve, reject) => {this.socket = io('ws://localhost:8080', {path: '/ws',transports: ['websocket'],auth: {token: '11223333'},});this.socket.on('connect', () => {console.log('WebSocket连接成功');this.status = '已连接服务器,正在录音...';});this.socket.on('disconnect', () => {console.log('WebSocket断开连接');this.status = '服务器连接已断开';});this.socket.on('transcript', (data) => {console.log('收到转写结果:', data);this.processTranscript(data);});this.socket.on('error', (error) => {console.error('WebSocket错误:', error);this.status = `连接错误: ${error.message}`;});});},

H5页面现象

后端日志:

21:48:33.774 [nioEventLoopGroup-2-1] INFO  i.n.handler.logging.LoggingHandler - [id: 0xc034c3bc, L:/[0:0:0:0:0:0:0:0]:8080] READ: [id: 0xc4e5890d, L:/[0:0:0:0:0:0:0:1]:8080 - R:/[0:0:0:0:0:0:0:1]:50069]
21:48:33.777 [nioEventLoopGroup-2-1] INFO  i.n.handler.logging.LoggingHandler - [id: 0xc034c3bc, L:/[0:0:0:0:0:0:0:0]:8080] READ COMPLETE
21:48:34.218 [nioEventLoopGroup-2-1] INFO  i.n.handler.logging.LoggingHandler - [id: 0xc034c3bc, L:/[0:0:0:0:0:0:0:0]:8080] READ: [id: 0x4170a495, L:/127.0.0.1:8080 - R:/127.0.0.1:50072]
21:48:34.219 [nioEventLoopGroup-2-1] INFO  i.n.handler.logging.LoggingHandler - [id: 0xc034c3bc, L:/[0:0:0:0:0:0:0:0]:8080] READ COMPLETE
 

核心原因:

  1. 前端 使用的是 Socket.IO 协议(基于 Engine.IO,带 EIO=4 参数)。

  2. 后端 实现的是 原生 WebSocket(通过 Netty 的 WebSocketServerProtocolHandler)。

    • 这两者 协议不兼容,Socket.IO 客户端无法直接连接原生 WebSocket 服务。

修改方案

特性Socket.IO原生 WebSocket
协议基于 Engine.IO,封装了 WebSocket + HTTP 长轮询纯 WebSocket(RFC 6455)
兼容性自动降级兼容旧浏览器(IE9+)仅支持现代浏览器(IE10+)
功能扩展内置房间、广播、自动重连、ACK 确认等需手动实现
数据传输支持二进制(需配置)和结构化数据(JSON)直接支持二进制和文本
连接复杂度高(握手阶段较长)低(直接建立 WS 连接)
适用场景实时性要求高、需复杂功能(如聊天室)轻量级、低延迟(如音频流、游戏)

我经过权衡后决定使用原生的WebSocket

修改后的H5代码如下:

connectWebSocket() {return new Promise((resolve, reject) => {const ws = new WebSocket('ws://localhost:8080/ws');ws.onopen = () => {console.log('WebSocket连接成功');this.status = '已连接服务器,正在录音...';this.socket = ws;resolve(); // ✅ 必须 resolve,才能继续录音};ws.onclose = () => {console.log('WebSocket断开连接');this.status = '服务器连接已断开';};ws.onmessage = (event) => {console.log('收到转写结果:', event.data);this.processTranscript(event.data);};ws.onerror = (error) => {console.error('WebSocket错误:', error);this.status = '连接错误';reject(error);};});},

完美运行!

http://www.lryc.cn/news/597390.html

相关文章:

  • Linux 723 磁盘配额 限制用户写入 quota;snap快照原理
  • Linux 环境下安装 MySQL 8.0.34 二进制 详细教程 附docker+k8s启动
  • VU2 学习笔记4 计算属性、监视属性
  • 北京互联网公司面试题精华解析
  • 计算机网络学习----Https协议
  • 直接偏好优化(DPO):原理、演进与大模型对齐新范式
  • python-82-基于ORM操作数据库(一)简单模型CRUD
  • UniappDay01
  • JavaWeb笔记12
  • MySQL深度理解-深入理解MySQL索引底层数据结构与算法
  • 容联云携手信通院,启动“智能体服务生态共创计划”
  • 华为云ELB(弹性负载均衡)持续报异常
  • 2025年Zigbee技术白皮书:全球物联网无线通信的关键创新
  • HF86611_VC1/HF86611Q_VC1:多通道USB HiFi音频解码器固件技术解析
  • 【自动化运维神器Ansible】深入解析Ansible Host-Pattern:精准控制目标主机的艺术
  • .Net core 部署到IIS出现500.19Internal Server Error 解决方法
  • Ubuntu系统下FFmpeg源码编译安装
  • 内网穿透技术深析:从原理到工具应用的全方位解读,无公网IP本地服务器外网访问实操
  • IGM弧焊机器人气体节约
  • 【数据结构】哈希——位图与布隆过滤器
  • 彩色转灰度的核心逻辑:三种经典方法及原理对比
  • zabbix监控MySQL数据库
  • 企业选择将服务器放在IDC机房托管的优势
  • React+Three.js实现3D场景压力/温度/密度分布可视化
  • Spring Boot与Python的联动:实战案例解析
  • 【智能模型系列】Unity通过访问Ollama调用DeepSeek模型进行本地部署
  • AI产品经理面试宝典第46天:模型评估与Prompt工程核心考点解析
  • Elasticsearch整合:Repository+RestClient双模式查询优化
  • iOS加固工具有哪些?企业级团队协作视角的实战分析
  • Swing-JFrame