你有没有遇到过这种场景?
聊天室里消息要实时更新,股票价格要秒级刷新,在线协作文档要别人一打字你就看到。
以前怎么做?——让浏览器每隔几秒问一次服务器:“有新消息吗?”
这叫轮询。效率很低,大部分时候你问十次,服务器都说"没有"。
后来有人发明了WebSocket,直接给浏览器和服务器之间拉了一条"专线"。
WebSocket是什么?
一句话:WebSocket是一种在浏览器和服务器之间保持长连接的通信协议。
它建立在HTTP之上,但连接一旦建立,就不再是HTTP那套"一问一答"的模式了。
打个比方:
- 传统HTTP像发微信。你发一条,对方回一条,聊完就断了。下次要聊,再重新发消息。
- WebSocket像打电话。拨通之后,双方可以随时说话,不用反复"喂喂喂,你能听到吗?"
它和普通HTTP有什么区别?
| HTTP轮询 | WebSocket | |
|---|---|---|
| 连接方式 | 每次请求都新建连接 | 建立一次,长期保持 |
| 通信方向 | 只能客户端先开口 | 双方都能主动发消息 |
| 延迟 | 取决于轮询间隔 | 接近实时 |
| 服务器开销 | 大量无效请求 | 连接维持即可 |
关键区别就两个字:双向。
HTTP是"客户问、老板答"。WebSocket是"你和老板可以互相喊话"。
它是怎么工作的?
整个过程分三步:
第一步:握手
浏览器发起一个普通的HTTP请求,但请求头里多了一句话:
Upgrade: websocket
Connection: Upgrade
意思是:“我想把这条线路从HTTP升级成WebSocket,行不行?”
服务器如果同意,就返回:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
“101"这个状态码很特别,意思是"协议切换成功”。之后这条路就不再走HTTP了。
第二步:保持连接
连接建立后,双方可以隨時互发消息。不需要再写HTTP请求头,消息格式也很轻量。
第三步:关闭连接
任何一方说"聊完了",就可以关闭连接。服务器也释放资源。
实际代码长什么样?
前端用起来非常简单:
// 建立连接
const ws = new WebSocket('wss://example.com/chat');
// 收到消息
ws.onmessage = function(event) {
console.log('服务器说:', event.data);
};
// 发送消息
ws.send('你好,服务器!');
// 连接关闭
ws.onclose = function() {
console.log('连接断了');
};
注意URL是wss://,这是加密版WebSocket,类似HTTPS和HTTP的关系。生产环境一定要用wss。
什么时候该用WebSocket?
以下场景特别适合:
- 即时通讯:聊天室、IM应用
- 多人协作:在线文档、白板
- 实时数据:股票行情、体育赛事比分
- 游戏同步:多人在线游戏的状态更新
- 通知推送:比轮询高效得多
以下场景没必要用:
- 偶尔刷一下的新闻页面 → 普通HTTP就够了
- 表单提交 → HTTP POST更简单
- 加载静态资源 → CDN + HTTP缓存搞定
用WebSocket就像开私家车上班。如果你家就在公司隔壁,走路更合适。但如果每天都要通勤,开车确实更高效。
常见问题
Q:WebSocket需要服务器特殊支持吗?
需要。普通Web服务器默认不支持,要用Node.js、Go、Java的WebSocket库,或者Nginx的反代配置。
Q:防火墙会拦截WebSocket吗?
一般不会。因为它走的是80或443端口,和HTTP/HTTPS一样,防火墙通常放行。
Q:断线了怎么办?
网络不稳定时连接会断。前端需要写重连逻辑,比如用指数退避:第一次1秒后重连,失败就2秒,再失败就4秒……
Q:一个WebSocket能传多大的消息?
理论上没限制,但实际中建议单条消息控制在几KB到几十KB。太大的数据应该拆分成多条,或者用文件上传。
总结
WebSocket的核心价值就一个:让服务器能主动找客户端。
在它出现之前,实时通信基本靠轮询,浪费资源还慢。有了WebSocket,浏览器和服务器之间多了一条持久通道,消息随时互通。
现在你打开一个网页,大概率已经在用WebSocket了——只是你自己不知道而已。
下次聊天不卡顿的时候,记得感谢它。