前端小白也能懂!轮询、长轮询、SSE、WebSocket 一网打尽

157 阅读4分钟

前言:数据怎么来,你知道吗?

前端小伙伴们常常会遇到这样的需求:

“我希望页面能实时显示最新数据,比如聊天消息、股票行情、或者任务进度……”

可是问题来了,你真的知道数据是怎么从服务器到浏览器的吗?

今天我们来聊聊前端最常见的四种获取数据方式:

  • 轮询 (Polling)
  • 长轮询 (Long Polling)
  • SSE (Server-Sent Events)
  • WebSocket

放心,我会用最小白能懂的语言,让你不仅能理解原理,还能在项目里直接用。


1️⃣ 轮询(Polling):每天打卡问“有没有新数据?”

轮询就是最简单粗暴的方式:客户端每隔一段时间去问服务器一次

客户端:喂,服务器,有新消息吗?
服务器:没有。
客户端:好吧,5 秒后再问。

优点

  • 实现简单,浏览器和服务器全兼容
  • 对实时性要求不高的小场景够用

缺点

  • 数据更新了也得等下一次轮询,延迟高
  • 没数据也要发请求,浪费带宽
  • 高并发时服务器压力大

JS 示例

setInterval(async () => {
  const res = await fetch('/api/status');
  const data = await res.json();
  console.log('最新状态:', data.status);
}, 5000);

2️⃣ 长轮询(Long Polling):耐心等待,服务器先别挂电话

长轮询就是在普通轮询的基础上做了优化:客户端发请求,服务器不立即返回,而是等到有数据或者超时才返回

客户端:服务器,我要新消息
服务器:没消息,等一下……(保持连接)
客户端:收到啦!立刻再问

优点

  • 几乎实时,延迟比普通轮询低很多
  • 兼容性好,比 WebSocket 更“稳”

缺点

  • 连接保持时间长,需要考虑服务器超时和资源占用
  • 实现比轮询稍复杂

JS 示例

async function longPoll() {
  const res = await fetch('/api/long-poll');
  const data = await res.json();
  console.log('收到数据:', data);
  longPoll(); // 收到数据后立刻再发请求
}
longPoll();

3️⃣ SSE(Server-Sent Events):服务器主动推送,前端只负责接收

SSE 是一种 单向实时推送 技术:服务器有新数据就直接“推”给客户端,客户端不用问。

服务器:嘿,你看,这条新消息来了
客户端:收到啦,快渲染!

优点

  • 实时性好,延迟低
  • 浏览器原生支持,自动重连
  • 使用 HTTP 协议,穿透代理和防火墙容易

缺点

  • 只能服务器→客户端,不能双向
  • 只能发送文本(如果要二进制就得自己序列化)

JS 示例

const es = new EventSource('/sse');
es.onmessage = e => console.log('收到数据:', e.data);

4️⃣ WebSocket:双向全双工通信

WebSocket 是最强大的方式:客户端和服务器建立一条持久连接,双方可以随时互相发消息

客户端:你好服务器,我想聊天
服务器:没问题,我也可以主动推送消息给你
客户端:太棒了,我们开始实时聊天吧!

优点

  • 延迟低,实时性最高
  • 双向通信,适合聊天、协作、在线游戏
  • 支持文本和二进制数据

缺点

  • 实现稍复杂,需要服务器支持 WebSocket 协议
  • 长连接占用服务器资源,需要心跳机制

JS 示例

const ws = new WebSocket('wss://example.com/socket');
ws.onmessage = e => console.log('收到数据:', e.data);
ws.send('你好服务器!');

5️⃣ 小结:什么时候用哪个?

技术实时性方向适用场景
轮询客户端→服务器数据更新不频繁,临时解决方案
长轮询中高客户端→服务器数据更新偶尔实时,兼容旧环境
SSE服务器→客户端实时通知、日志、进度条、股价行情
WebSocket最高双向聊天、协作、在线游戏、画板

记忆小技巧

  • 轮询:每天打卡问“有消息吗?”
  • 长轮询:等到有消息再回电话
  • SSE:服务器主动发消息,客户端接收
  • WebSocket:一条专属双向通道,随时聊天

6️⃣ 实战小建议

  1. 兼容性

    • 轮询、长轮询、SSE:浏览器原生支持好
    • WebSocket:老旧浏览器可能需要 polyfill
  2. 心跳与重连

    • 长连接(SSE/WebSocket)容易断,需要实现心跳/重连机制
  3. 带宽控制

    • 轮询频率不要太高,否则服务器扛不住
    • WebSocket/SSE 只在有数据时推送,更省资源
  4. 安全

    • HTTPS / WSS
    • Token 或 Cookie 鉴权

结语:选对技术,前端更轻松

前端获取实时数据并不是一件神秘的事,从轮询到 WebSocket,都是不断演进的技术手段。

  • 小白小项目:轮询就够
  • 想要低延迟:长轮询或 SSE
  • 聊天、游戏:WebSocket 是王道

记住: “轮询问、长轮询等、SSE推、WebSocket双向” ,面试时背上这句话,老板一听就懂你懂了。