websocket 的 binarytype 属性决定接收二进制数据时 event.data 的默认类型,初始值为 "blob",可设为 "blob"(封装为 blob,适合大文件处理)或 "arraybuffer"(转为 arraybuffer,适合字节级操作),需在连接建立后、首次接收前设置,且仅影响后续接收数据的解析方式。

WebSocket 的 binaryType 属性决定了二进制数据(如图片、音频、文件)在通过 message 事件接收时的默认格式,它不改变发送方式,只影响接收端解析结果。正确设置它,才能让 event.data 按预期变成 Blob 或 ArrayBuffer,避免类型错误或数据损坏。
binaryType 可选值及含义
binaryType 是 WebSocket 实例的可写属性,初始值为 "blob",支持两个字符串值:
-
"blob":接收到的二进制数据自动封装为
Blob对象(适合大文件、流式处理、后续用 URL.createObjectURL 或 FileReader) -
"arraybuffer":接收到的二进制数据直接转为
ArrayBuffer(适合需要字节级操作、解码协议、配合 TypedArray 或 DataView 使用)
接收 Blob 数据的典型用法
当服务端发送的是原始二进制(如 PNG 图片、MP4 片段),设为 "blob" 后可直接用于下载或预览:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
const ws = new WebSocket('wss://example.com');
ws.binaryType = 'blob';
ws.onmessage = function(event) {
if (event.data instanceof Blob) {
// 直接创建对象 URL 并显示图片
const url = URL.createObjectURL(event.data);
document.getElementById('img').src = url;
// 或保存为文件
const a = document.createElement('a');
a.href = url;
a.download = 'received.png';
a.click();
}
};
接收 ArrayBuffer 并进行字节处理
若需解析自定义二进制协议(如带 header 的帧结构),用 "arraybuffer" 更高效:
ws.binaryType = 'arraybuffer';
ws.onmessage = function(event) {
if (event.data instanceof ArrayBuffer) {
const view = new DataView(event.data);
const magic = view.getUint32(0); // 读前4字节魔数
const length = view.getUint32(4); // 接着4字节表示有效载荷长度
const payload = new Uint8Array(event.data, 8, length);
console.log('Magic:', magic, 'Payload length:', length);
// 进一步处理 payload...
}
};
注意事项与常见误区
binaryType 必须在连接建立后、首次接收消息前设置才可靠;动态修改虽生效,但已入队未触发的 message 事件仍按旧类型解析:
- 不要在
onopen之前设置 —— 此时 WebSocket 实例可能尚未准备好 - 不要依赖多次切换
binaryType来“重解释”同一份数据 —— 它只影响后续接收,不转换已有event.data - 发送二进制数据时(
ws.send(blob)或ws.send(arrayBuffer)),无需关心binaryType,发送逻辑不受影响
如何判断当前接收的数据类型
即使设置了 binaryType,也建议加类型检查,尤其在调试或兼容旧环境时:
ws.onmessage = function(event) {
if (event.data instanceof Blob) {
console.log('Received as Blob');
} else if (event.data instanceof ArrayBuffer) {
console.log('Received as ArrayBuffer');
} else {
console.log('Received as string or other type');
}
};
设置 binaryType 是接收端的事,不影响传输过程本身 —— WebSocket 底层始终以二进制帧传递,只是浏览器帮你做了格式包装。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










