websocket默认支持二进制传输,发送arraybuffer/typedarray高效低开销;接收端通过binarytype设为"arraybuffer"或"blob"控制event.data类型,需按类型解析并注意服务端支持、内存优化与字节序约定。

WebSocket 默认支持二进制数据传输,无需额外配置即可直接发送 ArrayBuffer、Blob 或 TypedArray(如 Uint8Array),这是实现高效通信的关键能力。关键在于发送端构造合适的二进制格式,接收端正确识别并解析 binaryType。
设置 binaryType 控制接收端数据类型
WebSocket 实例的 binaryType 属性决定 message 事件中 event.data 的类型,默认是 "blob",也可设为 "arraybuffer":
-
ws.binaryType = "arraybuffer":收到二进制消息时,event.data是ArrayBuffer,适合需要频繁读写字节(如解码协议、图像处理)的场景 -
ws.binaryType = "blob":收到的是Blob,适合大文件分片、流式读取或后续转为 URL 使用(如预览图片)
注意:binaryType 只影响接收端,不影响发送;切换后对已建立连接立即生效。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
发送 ArrayBuffer / TypedArray 高效低开销
直接传入 ArrayBuffer 或基于它的视图(如 Uint8Array、Int32Array)效率最高,避免序列化和字符串编码开销:
- 构造结构化数据:用
ArrayBuffer+DataView或TypedArray手动组织字段(如 header + payload),适合自定义二进制协议 - 发送已有二进制内容:例如从
fetch获取的ArrayBuffer、Canvas 导出的Uint8ClampedArray,可直接ws.send(arrayBuffer) - 避免隐式转换:不要传字符串或普通对象,否则会走 UTF-8 编码路径,增大体积且无法被接收端作为二进制解析
接收端解析 ArrayBuffer 或读取 Blob
根据 binaryType 设置,在 message 回调中处理:
- 若设为
"arraybuffer":直接用new DataView(event.data)或new Uint8Array(event.data)访问原始字节,适合快速解析协议头、提取字段 - 若设为
"blob":可用blob.arrayBuffer()转为 ArrayBuffer,或blob.text()(仅当内容是文本)、URL.createObjectURL(blob)(用于 img/video src) - 大 Blob 建议用
stream()分块读取,防止内存暴涨:const reader = blob.stream().getReader()
注意事项与性能建议
二进制传输虽高效,但需规避常见陷阱:
- 服务端必须支持二进制帧(主流 WebSocket 库如 ws、Socket.IO v4+、uWebSockets 都支持,但需确认配置)
- 避免高频小 ArrayBuffer 频繁创建——复用
ArrayBuffer和视图(如池化Uint8Array)可减少 GC 压力 - 跨平台协议需约定字节序(通常用
DataView显式指定littleEndian)和字段对齐 - 调试时可用
console.log(new Uint8Array(event.data).slice(0, 16))快速查看前 16 字节
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










