websocket默认支持二进制传输,需设binarytype为"arraybuffer",发送arraybuffer/typedarray/dataview,接收端统一用uint8array或dataview解析;大文件可选blob但需异步转arraybuffer。

WebSocket 默认支持二进制数据传输,无需额外编码,关键在于正确设置 binaryType 并使用 ArrayBuffer、Blob 或 TypedArray 发送。
设置 binaryType 为 "arraybuffer"
这是最常用且推荐的方式,确保接收到的数据是 ArrayBuffer 类型,便于后续用 Uint8Array、DataView 等解析:
const ws = new WebSocket('wss://example.com');
ws.binaryType = 'arraybuffer'; // 必须在连接打开前或打开后立即设置
ws.onopen = () => {
const buffer = new ArrayBuffer(4);
const view = new Uint32Array(buffer);
view[0] = 0x12345678;
ws.send(buffer); // 直接发送 ArrayBuffer
};
ws.onmessage = (event) => {
if (event.data instanceof ArrayBuffer) {
const view = new Uint32Array(event.data);
console.log('收到数值:', view[0]); // 如 0x12345678
}
};
发送其他二进制视图(如 Uint8Array、DataView)
发送 TypedArray 或 DataView 时,WebSocket 会自动提取底层 ArrayBuffer 并发送其内容:
-
ws.send(new Uint8Array([1, 2, 3, 4]))→ 接收端收到含 4 字节的ArrayBuffer -
ws.send(new DataView(new ArrayBuffer(8)))→ 发送 8 字节的原始缓冲区 - 注意:
send()不接受裸DataView.buffer外的任意对象,只认ArrayBuffer、TypedArray、Blob、USVString
接收时保持类型一致
即使发送的是 Uint8Array,接收端仍得到 ArrayBuffer(除非你显式设 binaryType = 'blob')。所以解析逻辑应统一基于 ArrayBuffer:
- 始终检查
event.data instanceof ArrayBuffer - 用
new Uint8Array(event.data)或new DataView(event.data)构建视图 - 避免直接对
event.data调用.slice()等方法(它不是TypedArray)
可选:用 Blob 传输大文件但需转换
适合上传图片、音频等大块数据,但需手动读取为 ArrayBuffer 才能高效解析:
- 发送:
ws.send(blob)(需先设ws.binaryType = 'blob') - 接收后用
blob.arrayBuffer().then(buf => { ... })转换,异步操作 - 一般场景优先用
'arraybuffer',更直接、无 Promise 开销
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











