前端实时通信技术:HTTP轮询、SSE、WebSocket、WebRTC

张开发
2026/4/7 0:50:24 15 分钟阅读

分享文章

前端实时通信技术:HTTP轮询、SSE、WebSocket、WebRTC
前言在Web开发中我们经常遇到需要“实时获取最新数据”的场景股票行情、聊天消息、语音识别、视频通话……这些场景对通信技术的要求各不相同。很多同学对这些技术的选型感到困惑什么时候用轮询什么时候用SSEWebSocket和WebRTC又有什么区别今天这篇文章就带大家彻底搞懂这几种技术的原理、优缺点和适用场景。一、技术全景图先看一张总览表快速了解四种技术的核心差异技术通信方向协议实时性复杂度典型场景HTTP短轮询单向客户端请求HTTP差有延迟低旧版消息通知HTTP长轮询单向模拟推送HTTP一般中兼容性要求高的场景SSE单向服务器→客户端HTTP好低消息推送、股票行情WebSocket双向全双工WS/WSS极好中聊天、游戏、实时语音识别WebRTC双向P2P媒体流UDP为主极好低延迟高音视频通话、实时会议二、HTTP轮询最原始的方式1. 短轮询Short Polling工作原理客户端每隔一段时间如1秒主动向服务器发起HTTP请求询问是否有新数据。javascript// 短轮询示例 setInterval(async () { const response await fetch(/api/messages); const data await response.json(); updateUI(data); }, 1000); // 每秒请求一次优点实现极其简单兼容所有浏览器和服务器缺点大量无效请求浪费资源实时性差延迟 轮询间隔服务器压力大适用场景几乎没有。已被更好的方案取代。2. 长轮询Long Polling工作原理客户端发起请求后服务器“挂起”这个请求直到有新数据或超时才返回。客户端收到响应后立即发起下一次请求。javascript// 长轮询示例 async function longPoll() { const response await fetch(/api/wait-for-messages); const data await response.json(); updateUI(data); longPoll(); // 立即发起下一次 } longPoll();优点相比短轮询无效请求少兼容性好可在不支持SSE/WebSocket的环境使用缺点服务器需要维持大量挂起连接实现比短轮询复杂仍有HTTP头开销适用场景需要兼容老旧浏览器的实时推送场景。三、SSEServer-Sent Events轻量级服务器推送什么是SSESSE是HTML5标准的一部分允许服务器单向向客户端推送数据。它基于HTTP协议使用简单。工作原理客户端通过EventSourceAPI建立连接服务器保持连接打开随时可以推送数据。javascript// 客户端代码 const eventSource new EventSource(/api/stream); eventSource.onmessage (event) { console.log(收到数据:, event.data); }; eventSource.onerror (error) { console.error(连接出错:, error); }; // 关闭连接 // eventSource.close(); javascript // 服务端代码Node.js Express示例 app.get(/api/stream, (req, res) { res.writeHead(200, { Content-Type: text/event-stream, Cache-Control: no-cache, Connection: keep-alive }); // 每秒推送一条消息 const interval setInterval(() { res.write(data: ${JSON.stringify({ time: Date.now() })}\n\n); }, 1000); req.on(close, () clearInterval(interval)); });优点简单基于HTTP无需特殊协议自动重连连接断开后浏览器自动尝试重连轻量比WebSocket更轻量适合单向推送支持自定义事件可以推送不同类型的事件缺点单向只能服务器→客户端客户端无法通过同一连接发送数据连接数限制浏览器限制同域名下6个左右并发连接不支持二进制数据只能传输文本通常用JSON或纯文本适用场景股票行情、加密货币价格消息通知中心日志实时输出AI对话流式输出配合打字机效果手动开关的语音转文字结果推送典型产品微信网页版的消息通知、微博实时提醒四、WebSocket真正的双向实时通信什么是WebSocketWebSocket是一种全双工通信协议在单个TCP连接上实现客户端和服务器之间的双向实时通信。工作原理通过HTTP升级握手建立连接之后切换为WebSocket协议保持长连接。javascript// 客户端代码 const ws new WebSocket(wss://example.com/socket); ws.onopen () { console.log(连接已建立); ws.send(JSON.stringify({ type: join, room: chat })); }; ws.onmessage (event) { const data JSON.parse(event.data); console.log(收到消息:, data); }; ws.onerror (error) { console.error(WebSocket错误:, error); }; ws.onclose () { console.log(连接已关闭); };javascript// 服务端代码Node.js ws库示例 import { WebSocketServer } from ws; const wss new WebSocketServer({ port: 8080 }); wss.on(connection, (ws) { console.log(客户端已连接); ws.on(message, (data) { console.log(收到:, data.toString()); // 广播给所有客户端 wss.clients.forEach(client { if (client ! ws client.readyState WebSocket.OPEN) { client.send(data); } }); }); ws.send(欢迎加入聊天室); });优点真正的双向实时客户端和服务器可以随时互相发送消息低延迟连接建立后消息直接传输无需HTTP头高效相比HTTP轮询大幅减少网络开销支持二进制可以传输二进制数据如音频流缺点实现复杂需要处理心跳、断线重连、消息确认等协议特殊需要服务器支持WebSocket协议负载均衡麻烦长连接对负载均衡器有特殊要求防火墙可能拦截某些网络环境可能阻断WebSocket适用场景即时通讯微信、QQ在线游戏实时位置同步协同编辑多人同时编辑文档实时语音转文字边说边出字实时数据看板监控系统典型产品微信部分功能、Slack、腾讯文档五、WebRTCP2P音视频通信什么是WebRTCWebRTCWeb Real-Time Communication是一个支持浏览器之间直接进行音视频通信的开源项目。它允许在不安装插件的情况下实现点对点P2P的音视频通话。核心组件getUserMedia获取麦克风/摄像头权限采集音视频流RTCPeerConnection建立P2P连接传输音视频流RTCDataChannel传输任意数据文件、文字等工作原理WebRTC需要信令服务器通常用WebSocket实现来交换连接信息但媒体数据走P2P的UDP通道。javascript// 获取麦克风流 const stream await navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, // 回声消除 noiseSuppression: true, // 噪声抑制 autoGainControl: true // 自动增益 }, video: true }); // 创建对等连接 const pc new RTCPeerConnection(); // 添加本地流 stream.getTracks().forEach(track { pc.addTrack(track, stream); }); // 接收远程流 pc.ontrack (event) { remoteVideo.srcObject event.streams[0]; }; // 创建offer发起方 const offer await pc.createOffer(); await pc.setLocalDescription(offer); // 通过信令服务器发送offer给远端优点极低延迟基于UDP无需服务器中转延迟通常400msP2P架构节省服务器带宽和计算资源内置音视频处理回声消除、降噪、自动增益等安全强制加密DTLS/SRTP缺点实现极其复杂需要处理STUN/TURN穿透、NAT、信令等P2P不可靠网络环境差时需要TURN服务器中转连接建立慢ICE候选收集、连接建立需要时间浏览器兼容性老浏览器不支持或支持不完整适用场景视频会议Zoom、腾讯会议语音通话Discord实时互动直播P2P文件传输AI语音助手实时对话场景典型产品Google Meet、ZoomWeb版、Discord六、技术选型决策树根据您的具体需求可以按照这个决策树来选择text需要实时通信 │ ├─ 只需要服务器推送给客户端 │ │ │ ├─ 是 → SSE简单、轻量 │ │ │ └─ 需要客户端也能发送数据 │ │ │ ├─ 文本/JSON数据 → WebSocket │ │ │ └─ 音视频流 → WebRTC │ └─ 需要极低延迟、P2P直连 │ └─ 是 → WebRTC七、实战场景对照表场景推荐技术原因股票行情推送SSE单向推送实现简单聊天室WebSocket双向通信实时性强视频会议WebRTCP2P低延迟内置音视频处理实时语音识别边说边出WebSocket / WebRTC需要上传音频流接收结果按住说话转文字HTTP SSE可选一次性上传结果可推送可不推送消息通知中心SSE单向推送自动重连协同编辑WebSocket双向实时同步AI对话流式输出SSE 或 WebSocketSSE更简单WebSocket更灵活在线游戏WebSocket双向实时延迟敏感实时日志查看SSE单向推送适合tail -f场景八、总结HTTP轮询老古董除非需要兼容极老的浏览器否则不要再用了。SSE如果你只需要服务器单向推送数据SSE是最简单、最轻量的选择。它的自动重连机制非常好用。WebSocket如果需要双向实时通信客户端和服务器都能随时发消息WebSocket是标准答案。它的生态最成熟。WebRTC如果要做音视频通话或需要极低延迟的P2P通信WebRTC是唯一的选择。但复杂度最高建议使用成熟的SDK如声网、腾讯云音视频。一个常见误区很多人以为SSE和WebSocket是竞争关系其实它们解决的是不同问题。SSE解决服务器推的问题WebSocket解决互相推的问题。两者可以共存各司其职。选型原则选最简单的能解决问题的方案SSE能搞定就不要上WebSocketWebSocket能搞定就不要上WebRTC除非有充分理由否则不要自己造轮子

更多文章