WebSocket的send()方法根据参数类型自动选择文本帧(opcode=1)或二进制帧(opcode=2):传字符串自动UTF-8编码为文本帧,传ArrayBuffer/TypedArray/Blob则发二进制帧;须确保readyState为OPEN,且字符串为合法UTF-8。

WebSocket 的 send() 方法根据你传入的数据类型自动决定发送文本帧还是二进制帧,不需要手动指定格式或设置 MIME 类型。
发送纯文本消息
直接传入字符串即可,浏览器会自动按 UTF-8 编码并以文本帧(opcode = 1)发出:
- 确保连接已就绪:
ws.readyState === WebSocket.OPEN,否则调用send()会抛出InvalidStateError - 字符串必须是合法的 UTF-8 内容;含非法代理对(如孤立的高/低 surrogate)可能导致静默截断或报错
- 服务端收到的是 UTF-8 字节流,需自行解析(例如用
JSON.parse()处理 JSON 字符串)
发送二进制消息
传入 ArrayBuffer、TypedArray(如 Uint8Array)或 Blob,WebSocket 自动使用二进制帧(opcode = 2):
- 推荐用
Uint8Array构造字节数组,再通过.buffer获取底层缓冲区:ws.send(new Uint8Array([0x48, 0x65, 0x6C, 0x6C, 0x6F]).buffer) - 可直接发送
ArrayBuffer实例(如从fetch().arrayBuffer()获取) -
Blob支持良好,浏览器内部会分片处理,适合上传文件片段
发送前的关键检查与注意事项
避免常见错误,提升稳定性:
- 始终检查
ws.readyState,只在OPEN状态下调用send() - 大体积数据建议分块发送,并关注
ws.bufferedAmount,防止内存积压 - 文本和二进制不能混在同一帧中;若需结构化混合载荷,优先选用二进制协议(如 Protocol Buffers)或 Base64 编码文本后放入二进制帧
- 部分老旧代理可能丢弃二进制帧,生产环境应做兼容性验证
服务端如何区分接收类型
服务端不能靠内容猜测类型,必须依据 WebSocket 帧的 opcode 判断:
- opcode = 1 → 文本帧 → 按 UTF-8 解码为字符串(如 Node.js 的
ws库默认返回string) - opcode = 2 → 二进制帧 → 返回原始字节(如
Buffer或ArrayBuffer),需按约定协议解析布局 - 不要在二进制数据里拼接字符串字段(如用
"header"+new Uint8Array(...)),应统一用二进制格式编码元信息


















