websocket连接需在onopen后发送消息且须设binarytype,send()支持多类型但需与服务端解包方式匹配,onmessage数据类型取决于服务端发送方式,onclose才是连接终结的可靠回调。

WebSocket 连接建立后,send() 是唯一合法的发送入口,onmessage 是接收消息的必经通道——没有封装、不走轮询、不依赖响应头,发就是发,收就是收。
WebSocket 实例创建后必须监听 onopen 再调用 send()
连接是异步建立的,new WebSocket(url) 立即返回对象,但底层 TCP 握手和协议升级需要时间。此时直接调用 send() 会触发 InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state。
- 务必在
socket.onopen回调里首次发消息,或用socket.readyState === WebSocket.OPEN做守卫 - 不要在
onopen外部写socket.send(...),哪怕只差一行代码 - 调试时可在控制台手动输入
socket.readyState查看当前状态:0=CONNECTING、1=OPEN、2=CLOSING、3=CLOSED
send() 支持字符串、Blob 和 ArrayBuffer,但服务端未必能原样解析
浏览器端发什么类型,服务端得按对应方式解包。常见错误是前端发 JSON 字符串,后端却当二进制处理,或反过来。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 发文本消息:直接
socket.send('hello')或socket.send(JSON.stringify({type:'msg', text:'hi'})) - 发二进制(如图片 ArrayBuffer):确保服务端明确声明接受
binaryType = 'arraybuffer',且用ws.send(data, { binary: true })(Node.jsws库) - 避免自动 toString():传数字、对象不加
JSON.stringify()会导致发过去的是[object Object]或字符串化的数字
onmessage 拿到的 event.data 类型取决于服务端发送方式
服务端用 ws.send('text'),前端 event.data 就是 string;服务端用 ws.send(buffer, { binary: true }),前端 event.data 默认是 Blob(除非你提前设了 socket.binaryType = 'arraybuffer')。
- 统一处理 JSON:服务端始终发字符串,前端收到后
try { JSON.parse(event.data) } catch(e) { ... } - 二进制场景下,务必在
onopen后立刻设置socket.binaryType = 'arraybuffer',否则event.data可能是Blob,读取需额外blob.arrayBuffer() - 不要假设
event.data总是字符串——尤其在跨语言服务端(如 Pythonwebsockets库默认发 bytes)
连接断开或出错时,onerror 不一定触发,onclose 才是最终状态出口
onerror 是网络层异常(如 DNS 失败、SSL 握手失败),而连接被服务器主动关闭、超时断连、心跳失败等,只会触发 onclose,且带 event.code 和 event.reason。
- 关键逻辑(如重连)应放在
onclose里,而不是onerror -
event.code === 1006表示异常关闭(无 close 帧),大概率是网络中断,不是服务端主动关的 - 不要在
onerror里调用socket.close()——它已经处于错误状态,再调会报错
真正容易被忽略的是 binaryType 的初始值和 readyState 的竞争条件:前者决定你拿到的是 Blob 还是 ArrayBuffer,后者决定你第一句话能不能发出去——这两个值在连接生命周期里只生效一次,设晚了或判错了,消息就静默丢失了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










