🏠 首页 攻略 WebSocket是什么?告别轮询的实时通信方案

WebSocket是什么?告别轮询的实时通信方案

WebSocket让浏览器和服务器建立一条持久连接,消息双向直达,再也不需要反复轮询了

你有没有遇到过这种场景?

聊天室里消息要实时更新,股票价格要秒级刷新,在线协作文档要别人一打字你就看到。

以前怎么做?——让浏览器每隔几秒问一次服务器:“有新消息吗?”

这叫轮询。效率很低,大部分时候你问十次,服务器都说"没有"。

后来有人发明了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了——只是你自己不知道而已。

下次聊天不卡顿的时候,记得感谢它。