WebSocket send()方法根据参数类型自动选择文本帧或二进制帧:字符串触发UTF-8编码的文本帧(opcode=1),ArrayBuffer等触发二进制帧(opcode=2);需检查readyState、合理分块传输并注意代理兼容性。

HTML5 中 WebSocket 的 send() 方法本身不区分文本或二进制数据,实际发送类型由传入参数的 JavaScript 数据类型决定——传字符串自动按 UTF-8 编码为文本帧;传 Blob、ArrayBuffer 或 TypedArray(如 Uint8Array)则触发二进制帧。
发送文本数据:直接传入字符串
最常见也最简单的方式。WebSocket 会自动将字符串按 UTF-8 编码,并以文本帧(opcode = 1)发送:
- 确保连接已建立(
readyState === WebSocket.OPEN),否则调用send()会抛错 - 直接传入字符串,例如:
ws.send("Hello, server!"); - 服务端收到的是标准 UTF-8 字节流,需按文本协议解析(如 JSON 字符串需自行
JSON.parse())
发送二进制数据:使用 ArrayBuffer 或 TypedArray
适合传输图像、音频、序列化结构体等原始字节。关键在于构造底层二进制视图:
- 推荐使用
Uint8Array构造可读写的字节数组,例如:const buffer = new Uint8Array([0x48, 0x65, 0x6C, 0x6C, 0x6F]); // "Hello"ws.send(buffer.buffer); // 传入 underlying ArrayBuffer - 也可传
ArrayBuffer实例(如从fetch().arrayBuffer()获取)或Blob(浏览器自动处理分片) - 注意:传
TypedArray时必须用其.buffer属性,否则部分浏览器可能报错或静默失败
服务端接收时的类型识别与处理
服务端需根据 WebSocket 帧的 opcode 判断数据类型,不能仅依赖内容:
立即学习“前端免费学习笔记(深入)”;
- opcode = 1 → 文本帧 → 按 UTF-8 解码为字符串(Node.js 的
ws库默认返回string) - opcode = 2 → 二进制帧 → 返回
Buffer(Node.js)或ArrayBuffer(浏览器),需按协议解析字节布局 - 避免在二进制数据中混用文本字段(如用字符串拼接二进制头),应统一用二进制格式编码元信息
注意事项与常见问题
实际开发中容易忽略的关键点:
- 发送前务必检查
ws.readyState,未连接或关闭状态下调用send()会抛InvalidStateError - 大文件建议分块发送(尤其 Blob),避免阻塞主线程或触发内存警告;可监听
bufferedAmount控制节奏 - 文本与二进制不可混用同一帧;若需同时传结构+载荷,推荐用二进制协议(如 Protocol Buffers)或 Base64 编码文本后放入二进制帧
- 某些老旧代理或中间件可能丢弃二进制帧,生产环境需测试兼容性











