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

【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.xdnf.cn/news/16070.html

相关文章:

  • (46)elasticsearch-华为云CCE无状态负载部署
  • #Linux内存管理# 在一个播放系统中同时打开几十个不同的高清视频文件,发现播放有些卡顿,打开视频文件是用mmap函数,请简单分析原因。
  • MCU芯片AS32S601在卫星光纤放大器(EDFA)中的应用探索
  • VPS海外部署Linux分布式计算任务调度-跨国资源整合方案
  • k8s:docker compose离线部署haborV2.13.1及采用外部的postgresql及redis数据库
  • uni-app动态获取屏幕边界到安全区域距离的完整教程
  • 在离线 Ubuntu 22.04机器上运行 ddkj_portainer-cn 镜像 其他相关操作也可以复刻 docker
  • Elasticsearch 学习笔记
  • 使用react编写一个简单的井字棋游戏
  • nodejs模块化
  • JS WebAPIs DOM节点概述
  • 前端_Javascript复习
  • C语言:第11天笔记
  • Python通关秘籍(四)数据结构——列表
  • 力扣 hot100 Day52
  • 网络基础DAY16-MSTP-VRRP
  • 2025 年最新 AI 技术:全景洞察与深度解析​
  • 02-netty基础-java四种IO模型
  • 深入解析 Spark:关键问题与答案汇总
  • 【Spring拦截器实战】路径拦截与访问控制系统设计
  • 期货配资软件开发注意事项?
  • Linux文件——文件系统Ext2(1)_理解硬件
  • Java (Spring AI) 实现MCP server实现数据库的智能问答
  • 2️⃣tuple(元组)速查表
  • 从“点状用例”到“质量生态”:现代软件测试的演进、困局与破局
  • vscode不识别vsix结尾的插件怎么解决?
  • 应用层攻防启示录:HTTP/HTTPS攻击的精准拦截之道
  • Datawhale AI 夏令营-心理健康Agent开发学习-Task1
  • MongoDB频繁掉线频繁断开服务的核心原因以及解决方案-卓伊凡|贝贝|莉莉|糖果
  • 【OpenCV篇】OpenCV——01day.图像基础