websocket连接需先完成http升级握手:客户端发送含upgrade: websocket、connection: upgrade、sec-websocket-key等头的get请求,服务端校验后返回101状态码及sec-websocket-accept响应头,握手成功后readystate变为open方可通信。

用 new WebSocket(url) 就能建立连接,但真正连上并可用,得走完握手、状态校验和事件响应三个关键环节。
连接必须用 ws:// 或 wss:// 协议
URL 不能是 http:// 或 https://,否则会直接抛 SecurityError。生产环境强烈推荐 wss://(类似 HTTPS),避免被中间代理或防火墙拦截。
-
ws://localhost:8080/chat—— 仅限开发调试 -
wss://api.example.com/ws—— 正式部署标准写法
监听 open 事件才算真正连通
WebSocket 实例创建后立即开始握手,但此时 readyState 是 0(CONNECTING)。只有触发 onopen,状态才变为 1(OPEN),这时才能安全调用 send()。
- 在
onopen里发认证消息、初始化数据很常见 - 如果提前调
send(),不会报错但消息会被丢弃(静默失败)
服务端必须支持 WebSocket 协议升级
浏览器发的是 HTTP GET 请求,带 Upgrade: websocket 和 Connection: Upgrade 头;服务端必须返回 101 Switching Protocols 状态码,并带上 Sec-WebSocket-Accept 才算握手成功。
- 普通 Express/Flask/Nginx 默认不支持——需额外集成(如 Node.js 的
ws库、Python 的websockets) - 若用 Nginx 反向代理,必须显式配置
proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "upgrade";
错误和断开不会自动重连
onerror 和 onclose 触发后,readyState 变为 3(CLOSED),连接彻底失效。WebSocket API 不提供内置重连机制,需手动实现:
- 在
onclose中启动定时器,延迟几秒后新建WebSocket实例 - 建议加入重试次数限制(如最多 5 次)和指数退避(首次 1s,下次 2s,再下次 4s…)
- 连接恢复后清空计数器,避免累积重试
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











