WebSocket 入门:从轮询到实时推送
HTTP 是「一问一答」的模型,浏览器不问,服务器不答。聊天室、行情推送、协同编辑这类需要服务器主动推消息的场景,靠不停轮询既浪费带宽又有延迟——WebSocket 就是为此而生的全双工通道。
一、握手是怎么回事
WebSocket 复用 HTTP 完成握手:客户端发一个带 Upgrade: websocket 头的 GET 请求,服务器返回 101 Switching Protocols,之后这条 TCP 连接就脱离了 HTTP 语义,双方可以随时互发帧。握手成功后协议切换为 ws://(加密为 wss://),URL 写法与 http 相同。
二、浏览器端最小实现
const ws = new WebSocket('wss://echo.example/ws'); onopen 时发消息,onmessage 收消息,onclose 里做重连。重点提示:直接 new 出来的连接没有自动重连,生产环境必须自己包一层——记录重连次数、指数退避、页面可见时立即恢复,这三点是稳定性的关键。
三、心跳与保活
中间的 Nginx、负载均衡默认 60 秒就掐掉空闲连接,所以客户端每 30 秒发一个 ping 帧(协议层 ping/pong 不占业务消息),服务器超时未收到 pong 就判定掉线。漏做心跳的 WebSocket 在生产上「莫名断连」几乎都是这个原因。
四、与 SSE 怎么选
只需要服务器到浏览器的单向推送(如公告、通知栏),用 SSE 更简单:纯 HTTP、自动重连、浏览器原生支持;需要双向交互(聊天、协作、联机对战)才上 WebSocket。按需选型,别为了技术栈上 WebSocket。
小结:握手靠 HTTP Upgrade,保活靠心跳,稳定性靠重连策略。掌握这三件事,WebSocket 就能从「会跑 demo」进阶到「敢上生产」。
- 点赞
- 收藏
- 关注作者
评论(0)