websocket的send()方法可直接发送字符串(自动utf-8编码为文本帧)或二进制数据(arraybuffer、typedarray、blob等自动为二进制帧),无需手动设置mime类型;发送前须确保readystate为open,且字符串为合法utf-8。

WebSocket 的 send() 方法可以直接发送纯文本(字符串)或二进制数据(Blob、ArrayBuffer、TypedArray 等),但具体行为取决于数据类型和服务器支持,不需要手动设置 MIME 类型或额外封装。
发送纯文本数据
直接传入字符串即可,WebSocket 会自动以 UTF-8 编码发送:
const ws = new WebSocket('wss://example.com');
ws.onopen = () => {
ws.send('Hello, server!'); // ✅ 正确:字符串自动按文本帧发送
};
注意:发送的必须是合法的 UTF-8 字符串。若含非法代理对(如未配对的 surrogate),浏览器可能抛出 InvalidStateError 或静默截断。
发送二进制数据
支持多种二进制类型,WebSocket 会自动选择合适的帧类型(binary frame):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
ArrayBuffer:底层原始字节缓冲区 -
Uint8Array、Int32Array等 TypedArray:引用同一ArrayBuffer,发送其内容 -
Blob:需注意浏览器兼容性(现代浏览器均支持)
示例:
// 发送 ArrayBuffer
const buffer = new ArrayBuffer(4);
const view = new Uint8Array(buffer);
view.set([0x01, 0x02, 0x03, 0x04]);
ws.send(buffer); // ✅ 发送二进制帧
// 发送 TypedArray(等价于 send(buffer))
ws.send(view);
// 发送 Blob
const blob = new Blob(['\x01\x02\x03'], {type: 'application/octet-stream'});
ws.send(blob);
区分文本帧与二进制帧的关键点
WebSocket 协议本身不携带 MIME 类型,帧类型由数据类型决定:
- 字符串 → 自动作为 text frame 发送
-
ArrayBuffer/TypedArray/Blob→ 自动作为 binary frame 发送 - 不能用
JSON.stringify()包装二进制数据再 send —— 那会变成字符串,失去二进制语义 - 服务端需按对应帧类型解析(例如 Node.js 的
ws库中,message事件的isBinary属性可判断)
常见误区与建议
避免以下做法:
- 用
ws.send(JSON.stringify(obj))发送复杂对象后,又期望服务端收到二进制 —— 实际仍是文本帧 - 把
Uint8Array转成字符串再 send(如String.fromCharCode(...))—— 易乱码且非标准二进制传输 - 忽略连接状态:在
ws.readyState !== WebSocket.OPEN时调用send()会失败(静默丢弃或报错)
安全发送前建议检查:
if (ws.readyState === WebSocket.OPEN) {
ws.send(data);
} else {
console.warn('WebSocket not ready, dropping message');
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










