websocket默认支持二进制传输,需设binarytype为"arraybuffer"以直接操作字节;可发送arraybuffer、typedarray等,接收时用uint8array或dataview解析;须自定义帧格式(如4字节长度头+负载)应对分片与合并。

WebSocket 默认支持二进制数据传输,关键在于正确设置 binaryType 并合理处理 ArrayBuffer 或 Blob。
设置 binaryType 为 "arraybuffer"
这是最常用、最可控的方式。WebSocket 实例默认的 binaryType 是 "blob",但处理音频、图像、协议数据时,"arraybuffer" 更方便直接操作字节:
- 在连接建立后(
onopen回调中)立即设置:ws.binaryType = "arraybuffer"; - 这样收到的
message事件中event.data就是ArrayBuffer,可直接用Uint8Array、DataView解析
发送二进制数据
可以直接发送 ArrayBuffer、TypedArray(如 Uint8Array)、Blob 或 ArrayBufferView:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 构造原始字节并发送:
const buf = new Uint8Array([0x01, 0x02, 0xFF]);<br>ws.send(buf.buffer); // 发送底层 ArrayBuffer
- 或直接发送视图(自动提取 buffer):
ws.send(buf); // Uint8Array 也可直接 send - 发送大文件片段时,可用
slice()分块:ws.send(arrayBuffer.slice(start, end));
接收并解析二进制消息
监听 message 事件,检查 event.data 类型,再用合适方式读取:
- 若已设
binaryType = "arraybuffer":ws.onmessage = (e) => {<br> if (e.data instanceof ArrayBuffer) {<br> const view = new Uint8Array(e.data);<br> console.log("收到字节:", view);<br> // 比如前 4 字节为 int32 长度,后续为 payload<br> const dv = new DataView(e.data);<br> const len = dv.getUint32(0, false); // 大端<br> }<br>}; - 若保留
"blob"类型,需用blob.arrayBuffer()转换(注意异步):e.data.arrayBuffer().then(buf => { /* 处理 */ });
注意帧边界与协议设计
WebSocket 不保证消息原子性——多个 send() 可能被合并,单次 send() 也可能被分片(尤其大 buffer)。实际应用中建议:
- 自定义简单帧格式:例如 4 字节长度头 + 原始负载,接收端累积拼接后再按头解析
- 避免依赖单次
message对应一次逻辑包;始终按协议边界拆分数据 - 服务端也需配合实现相同二进制协议(如使用 Node.js 的
ws库时,同样要处理Buffer)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










