代码改变世界

完整教程:WebSocket 通俗讲解

2025-12-10 09:22  tlnshuju  阅读(1)  评论(0)    收藏  举报

WebSocket 通俗讲解:让网页“活”起来的秘密通道

想象一下你和同事在线协作写文档。
他刚敲完一句话,而你这边——
要么得“刷新”才能看到更新,要么干脆半分钟都没反应。

是不是很崩溃?

问题不在你网卡,也不在你代码写得烂,而在于——
HTTP 本身天生就不适合“实时通信”。


一、HTTP 的局限:单行道上的拥堵

HTTP 协议诞生于上世纪 90 年代,最初的目标很朴素:
“让浏览器能从服务器拿到网页。”

于是,它被设计成了一条单行道

客户端(浏览器)发请求 → 服务器响应 → 链接关闭。

这就好比你每次和朋友说话,都得重新拨电话:

“喂,我要一句话。”
“好的,给你。”
——挂断。

当时,这个模型非常高效。毕竟那个年代,网页都是静态的。
可如今,互联网变了——

我们需要聊天、协作、实时监控、股票推送……
结果 HTTP 这种“有事才问”的模式,就成了拖后腿的瓶颈。


在这里插入图片描述

二、WebSocket 登场:让网页“活”起来

2011 年,WebSocket 正式成为标准。
它的出现,就像在单行道上开出了一条双向快车道

客户端和服务器之间,不再是“问答模式”,
而是一条常驻通道——
双方都可以随时发消息,不必重新握手。

简单理解:

HTTP 是“书信来往”,
WebSocket 是“实时聊天”。


三、WebSocket 是怎么工作的?

1️⃣ 客户端请求升级
一开始,浏览器还是用 HTTP 发起请求,只不过在请求头里加了两行特殊的暗号:

Upgrade: websocket
Connection: Upgrade

这就相当于在 HTTP 信封里夹了一张小纸条:“嘿,我想聊实时的~”

2️⃣ 服务器同意切换
服务器看到这纸条,如果也支持 WebSocket,就回复:

HTTP/1.1 101 Switching Protocols

意思是:“OK,咱俩换个频道聊吧。”

3️⃣ 升级成功,连接保持
从这之后,HTTP 的那套规则就不再用了。
连接保持打开状态,双方可以自由发消息

4️⃣ 维持心跳
为防止网络中途断开,WebSocket 还支持 ping/pong 心跳包,
确保双方都还在线。

整个过程,只有最初的“握手”是 HTTP,之后的通信都是基于 TCP 的持久通道。


在这里插入图片描述

四、为什么大家都爱 WebSocket?

双向通信 —— 不用轮询,不用刷新,消息瞬间同步。

低延迟 —— 握手一次,多次通信,延迟极低。

节省资源 —— 一个连接可传递上千条消息,无需反复开关连接。

支持多种格式 —— 文本、JSON、二进制,想发啥发啥。

广泛兼容 —— 所有现代浏览器、框架(如 Spring、Node.js、Django)都原生支持。

适合高频更新场景 —— 聊天、协作文档、游戏联机、股票行情、IoT监控……


五、但它也不是万能的

WebSocket 的魔力也有代价。

⚙️ 资源占用:每个客户端都要保持一个连接,对服务器压力不小。

无内建重连机制:断线得你自己写逻辑重连。

扩展复杂:多节点部署时,要做“粘性会话”或消息转发。

安全验证麻烦:没有 CORS 概念,必须手动校验来源与 Token。

不适合流媒体:音视频流还是得交给 WebRTC 这类专用协议。


六、该什么时候用 WebSocket?

适用场景:

  • 聊天系统(双向互动)
  • 协作文档、白板(实时同步)
  • 股票行情、监控仪表盘(高频更新)
  • 在线游戏、IoT 实时数据

不适用场景:

  • 数据更新很少(每小时几次)
  • 只需要单向推送(新闻播报)
  • 防火墙或代理环境复杂(阻拦协议升级)
  • 传输大流量音视频

对于单向推送场景,Server-Sent Events (SSE) 更轻便,还能自动重连。
对于偶尔更新的系统,简单的 轮询(polling) 就够了。


七、结语:WebSocket,让网络不再“单向”

HTTP 像邮差,一封一封地传信;
WebSocket 像对讲机,双方随时通话。

它并不是银弹(silver bullet),
但它填补了 Web 世界中一个巨大的空白——实时性

如今,不论是协作文档、交易系统还是游戏匹配,
WebSocket 都是那根让互联网“活”起来的神经线。

选对通信方式,
你写的网页,就能像人一样“说话”。