JavaScript如何在WebSocket中处理ArrayBuffer二进制数据
时间:2026-08-12 | 作者:深海捕梦者 | 阅读:0WebSocket在默认情况下接收二进制消息时,通常按ArrayBuffer来处理。 比较稳妥的做法,是在onopen里把binaryType设为'arraybuffer'。
拿到数据后,可以通过Uint8Array、DataView或TextDecoder来完成解析。发送二进制内容时,则传ArrayBuffer本身,或者传TypedArray.buffer。
另外还得留意Blob的兼容性问题,以及空buffer这类边界情况。
WebSocket 默认接收的二进制数据是 ArrayBuffer,但需要显式设置 binaryType 才能正确解析,否则可能收到 Blob 或解析失败。
设置 binaryType 为 'arraybuffer'
连接建立后、接收数据前,必须将 WebSocket 实例的 binaryType 设为 'arraybuffer'。
否则,event.data 可能是 Blob。尤其在未设置时,不同浏览器的行为可能不一致。
- 推荐在
onopen回调中立即设置:
ws.binaryType = 'arraybuffer'; - 若设为
'blob',后续需手动调用blob.arrayBuffer(),增加异步开销 - 不能在连接前设置(实例未初始化完成),也不能在
onmessage中临时改——它只影响后续接收的数据
在 onmessage 中安全读取 ArrayBuffer
event.data 是 ArrayBuffer,不能直接操作。
通常需要借助 Uint8Array、DataView 或 TextDecoder 来解析。
- 基础字节读取:
const uint8 = new Uint8Array(event.data); console.log(uint8[0]); - 结构化读取(如含 header + payload):
const dv = new DataView(event.data); const len = dv.getUint32(0, false); // 大端 - 转字符串(UTF-8):
const decoder = new TextDecoder(); const str = decoder.decode(event.data); - 避免直接
new Uint8Array(event.data)后修改原 buffer —— 若需复用 buffer,先slice()防止意外共享
发送 ArrayBuffer 数据
发送时可直接传 ArrayBuffer、TypedArray(如 Uint8Array)或 DataView,WebSocket 自动处理。
- 构造并发送:
const buf = new ArrayBuffer(4); const view = new DataView(buf); view.setUint32(0, 123456); ws.send(buf); - 从已有数组发送:
const arr = new Uint8Array([1, 2, 3, 4]); ws.send(arr.buffer); // 注意:send(arr) 也可,但底层仍用 buffer - 注意:不要 send
Uint8Array实例本身(虽兼容),明确传.buffer更清晰;若只发部分,可用arr.subarray(start, end).buffer
错误处理与兼容性注意
ArrayBuffer 支持度良好(IE10+),但仍需规避常见陷阱。
- 检查
event.data instanceof ArrayBuffer,避免因binaryType未设导致收到Blob - 服务端返回空 ArrayBuffer(
event.data.byteLength === 0)是合法的,需主动判断 - 大文件分片传输时,前端需自行拼接 ArrayBuffer(用
Uint8Array合并再.buffer) - 调试时可用
console.log(new Uint8Array(event.data).slice(0, 16))快速查看前 16 字节
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- JavaScript正则表达式批量处理HTML标签转义与替换方法
- 时间:2026-08-21
-
- JavaScript函数默认参数的精准JSDoc类型注解方法
- 时间:2026-08-21
-
- JavaScript设置Cookie的SameSite属性防范CSRF攻击
- 时间:2026-08-21
-
- JavaScript中BOM如何打开新的浏览器窗口标签
- 时间:2026-08-20
-
- JavaScript微任务队列在事件循环中的执行机制
- 时间:2026-08-20
-
- JavaScript中网络超时如何用流程控制实现中断
- 时间:2026-08-20
-
- JavaScript防抖函数原理与减少高频事件触发方法
- 时间:2026-08-20
-
- TypeScript六个颠覆认知的核心知识点解析
- 时间:2026-08-20
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
