websocket.send()可发送domstring、arraybuffer、blob或typedarray;不可直接发送对象、undefined或null,须先json.stringify()序列化,且需确保ws.readystate为open。

WebSocket.send() 能发什么类型的数据
send() 方法接受 DOMString、ArrayBuffer、Blob 或 TypedArray(如 Uint8Array)。不能直接传普通对象或 JSON.stringify() 以外的字符串化结果——比如传 {a:1} 会报 TypeError: Failed to execute 'send' on 'WebSocket': InvalidStateError,因为对象不是合法类型。
常见错误是误以为能直接 send 对象,实际必须先序列化;也有人传 undefined 或 null,这会导致静默失败或连接关闭。
- 文本数据:用
string或JSON.stringify(obj) - 二进制数据:优先用
ArrayBuffer或Uint8Array,避免用Blob(需额外blob.arrayBuffer(),增加异步开销) - 发送前务必检查
ws.readyState === WebSocket.OPEN,否则send()会抛错
发送 JSON 文本时要不要手动加双引号或换行
不需要。只要传的是合法 string,服务端收到的就是原始字节流,不带额外包装。比如 ws.send('{"id":42}') 和 ws.send(JSON.stringify({id:42})) 效果完全一样。
容易踩的坑是重复序列化:ws.send(JSON.stringify(JSON.stringify(obj))),导致服务端收到的是带转义的字符串,比如 "{\"id\":42}",解析时报错 Unexpected token \ in JSON。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 确保只调用一次
JSON.stringify() - 如果后端要求固定字段(如
{"type":"msg","data":...}),建议封装成函数统一处理,避免每次手写 - 调试时可在控制台打印
typeof data和data.constructor.name确认类型
发送 ArrayBuffer 和 Uint8Array 的区别与选择
两者都可发二进制,但语义不同:ArrayBuffer 是内存块容器,Uint8Array 是视图。调用 ws.send(buf) 时,浏览器内部会按 ArrayBuffer 处理;传 Uint8Array 会自动取其 .buffer。
性能上没实质差异,但 Uint8Array 更常用,尤其配合 TextEncoder 或 fetch().arrayBuffer() 使用。注意别传错引用:修改原 Uint8Array 内容后又发它,可能发出去的是已改数据(因共享底层 buffer)。
- 构造二进制消息推荐:
new TextEncoder().encode("hello")→ 得到Uint8Array - 从图片等资源读取:
await file.arrayBuffer()→ 直接得ArrayBuffer - 避免:
ws.send(new Uint8Array([1,2,3]).buffer.slice(0,2))——slice()返回新ArrayBuffer,但内容可能被截断或对齐异常
为什么 send 后服务端收不到,或者收到空数据
最常见原因是连接未就绪就发数据。WebSocket 建立是异步的,new WebSocket(url) 后立即 send(),大概率触发 InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state。
另一个隐蔽问题是跨域或代理拦截:某些 Nginx 配置未透传 Upgrade 请求头,导致连接降级为 HTTP,此时 send() 看似成功,实则发到了错误 endpoint,服务端根本没收到。
- 必须在
ws.onopen = () => { ws.send(...) }或ws.addEventListener('open', ...)中发首条消息 - 发完可监听
ws.onerror和ws.onclose,检查event.code(如1006表示连接异常中断) - 用浏览器 DevTools 的 Network → WS → Frames 标签,确认 Frames 列表里真有你发的那条记录,且 Type 是
text或binary
send() 行为本身很直白,真正复杂的是状态管理、类型转换时机和网络中间件的兼容性。尤其是二进制场景下,buffer 生命周期、视图偏移、编码一致性,稍不注意就会在某个浏览器或某次部署后突然出问题。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










