websocket默认支持二进制数据收发,需设binarytype为'arraybuffer'或'blob';发送用arraybuffer/typedarray,接收后可用dataview解析。

WebSocket 在 JavaScript 中默认支持二进制数据的发送和接收,关键在于正确设置 binaryType 属性,并使用 ArrayBuffer 或 Blob 类型的数据。
发送二进制数据
要发送二进制数据,需确保数据是 ArrayBuffer、TypedArray(如 Uint8Array)或 Blob。WebSocket 会自动识别并以二进制帧发送。
- 推荐使用
ArrayBuffer或Uint8Array:它们内存高效、操作灵活 - 避免直接传普通字符串或对象,否则会被转为 UTF-8 文本帧
- 示例:发送 4 字节整数
const ws = new WebSocket('wss://example.com');
ws.onopen = () => {
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
view.setUint32(0, 1234567890, true); // 小端序
ws.send(buffer); // 自动作为 binary frame 发送
};
接收二进制数据
WebSocket 默认把二进制消息当作 Blob,但更常用的是设为 'arraybuffer',便于用 DataView 或类型数组解析。
- 在连接建立后、收到消息前,设置
ws.binaryType = 'arraybuffer' - 若不设置,
event.data可能是Blob,需调用.arrayBuffer()转换,增加异步开销 - 接收后可直接用
DataView或Uint8Array解析结构化数据
ws.binaryType = 'arraybuffer'; // 必须设在 onmessage 之前或 onopen 里
ws.onmessage = (event) => {
if (event.data instanceof ArrayBuffer) {
const view = new DataView(event.data);
console.log('收到 32 位整数:', view.getUint32(0, true));
}
};
处理 Blob 类型(备选方案)
当服务端返回大文件(如图片、音频)且内存敏感时,可用 Blob 模式减少内存占用。
- 设
ws.binaryType = 'blob' -
event.data是Blob,可用URL.createObjectURL(blob)直接用于<img>或<audio></audio> - 如需读取内容,用
blob.arrayBuffer()(返回 Promise)或blob.text()
注意事项与常见问题
实际使用中容易忽略几个细节:
-
binaryType必须在连接打开后、首次接收前设置;修改它只影响后续消息 - 发送
TypedArray(如Uint8Array)等价于发送其.buffer,无需额外包装 - 不要尝试对
ArrayBuffer做 JSON 序列化;它是原始内存块,不是可序列化对象 - 服务端必须支持二进制帧(绝大多数 WebSocket 服务都支持,如 Node.js 的
ws、Python 的websockets)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











