目录
一、Netty介绍
1. Netty 的核心特性
2. Netty 的核心组件
3. Netty 的线程模型
4. Netty 的应用场景
5. 为什么选择 Netty?
二、都有哪些实时通讯技术
1. 基于 Web 的实时通讯
2. 移动端与跨平台实时通讯
3. 音视频实时通讯(WebRTC)
4. 游戏与低延迟场景
5. 分布式系统实时通讯
6. 其他新兴技术
三、什么是websocket
1. WebSocket 的核心特点
2. WebSocket 协议详解
3. WebSocket 与 HTTP 对比
4. WebSocket 应用场景
5. WebSocket 代码示例
7. WebSocket 的局限性
8. 替代方案对比
四、实现websocket的框架技术
1. 后端 WebSocket 框架
2. 前端 WebSocket 技术
3. 高级功能与优化技术
4. 选型建议
5. 完整示例(Spring Boot + Vue.js)
五、怎么实现HTTP长轮询
1. 基本原理
2. 服务端实现(以 Node.js 为例)
3. 客户端实现(JavaScript)
4. 优化与注意事项
5. 对比其他技术
6. 适用场景
六、聊聊四种实时通信技术
1. 短轮询
2. 长轮询
3. WebSocket
4. Server Send Event(SSE)
5. 总结
七、长轮询与短轮询的区别
1. 工作机制对比
2. 性能与资源消耗
3. 典型应用场景
4. 代码实现对比
5. 优缺点总结
6. 如何选择?
7. 可视化流程对比
8. 使用java实现长轮询和短轮询
八、常见协议
九、Coturn 介绍
1. Coturn 的核心功能
2. 为什么需要 Coturn?
3. Coturn 的安装与配置
4. 与 WebRTC 集成
5. 性能优化与安全
6. Coturn 的替代方案
7. 常见问题
总结
十、Protocol Buffers (PB) 协议详解
1、PB协议基本概念
2、PB协议工作原理
3、PB在IM系统中的应用
4、PB与其他协议对比
5、PB使用最佳实践
6、融云IM客户端使用的通信技术
一、Netty介绍
Netty 是一个高性能、异步事件驱动的 Java 网络应用框架,主要用于快速开发可扩展、高并发的网络服务器和客户端程序。它基于 Java NIO(Non-blocking I/O)技术,简化了 TCP/UDP 套接字编程,并提供了高度抽象的 API,广泛应用于分布式系统、游戏服务器、RPC 框架(如 Dubbo)、实时通信(如 WebSocket)等领域。
1. Netty 的核心特性
异步非阻塞 I/O
基于 Java NIO,通过事件驱动模型处理连接、读写等操作,避免线程阻塞,支持高并发连接(如百万级长连接)。
高性能
零拷贝(Zero-Copy):减少内存复制,提升数据传输效率。
内存池化:复用缓冲区(ByteBuf),降低 GC 压力。
高效的 Reactor 线程模型:支持单线程、多线程或主从多线程模式。
模块化设计
提供可插拔的组件(如编解码器、SSL/TLS 支持、HTTP 协议栈等),按需扩展。
健壮性
处理网络闪断、流量控制、拆包/粘包等常见问题,内置心跳检测机制。
易用性
链式调用的 API 设计(如 ChannelPipeline),简化开发复杂度。
2. Netty 的核心组件
Channel
代表一个网络连接(如 Socket),支持异步 I/O 操作。
EventLoop
事件循环,负责处理 Channel 的 I/O 事件(如读写、连接)。一个 EventLoop 可绑定多个 Channel。
ChannelPipeline
责任链模式,包含一系列 ChannelHandler,用于处理入站(Inbound)和出站(Outbound)数据(如编解码、业务逻辑)。
ByteBuf
Netty 的自定义字节容器,比 Java NIO 的 ByteBuffer 更灵活,支持动态扩容和内存池化。
3. Netty 的线程模型
Netty 采用 Reactor 模式,常见配置:
单线程模型:所有 I/O 操作由一个 EventLoop 处理(适合低并发场景)。
多线程模型:一组 EventLoop 处理 I/O,共享一个 Boss 线程接收连接。
主从多线程模型:Boss 线程组负责接收连接,Worker 线程组处理 I/O(主流方案)。
4. Netty 的应用场景
RPC 框架:如 Dubbo、gRPC 的底层通信。
实时通信:WebSocket、MQTT 服务器。
游戏服务器:处理大量玩家并发连接。
大数据:如 Hadoop 的 Avro RPC。
HTTP 服务器/代理:如高性能网关(类似 Nginx)。
示例代码(简易 Echo 服务器)
public class EchoServer {public static void main(String[] args) throws Exception {EventLoopGroup bossGroup = new NioEventLoopGroup(); // 接收连接EventLoopGroup workerGroup = new NioEventLoopGroup(); // 处理 I/Otry {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new EchoServerHandler()); // 业务逻辑}});ChannelFuture f = b.bind(8080).sync(); // 绑定端口f.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}// 业务处理器
public class EchoServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {ctx.write(msg); // 回写数据}
}
5. 为什么选择 Netty?
对比 Java NIO:Netty 封装了 NIO 的复杂性(如 Selector、ByteBuffer),提供更友好的 API。
对比 Tomcat:Tomcat 是 HTTP 服务器,而 Netty 更底层,适合自定义协议和高性能场景。
社区活跃:Netty 是开源项目(GitHub),被众多知名项目(如 Spark、Elasticsearch)使用。
如果需要处理高并发网络编程,Netty 几乎是 Java 生态中的首选框架。
二、都有哪些实时通讯技术
实时通讯(Real-Time Communication, RTC)技术用于实现低延迟、高并发的数据交互,广泛应用于即时通讯、在线协作、游戏、物联网等领域。以下是主流的实时通讯技术分类及代表方案:
1. 基于 Web 的实时通讯
(1) WebSocket
特点:全双工通信,建立在 TCP 上,服务端可主动推送数据。
场景:聊天应用、实时通知、在线游戏。
协议:ws:// 或 wss://(加密)。
库/框架:
前端:浏览器原生 API、Socket.IO(兼容降级)。
后端:Netty(Java)、Socket.IO(Node.js)、Django Channels(Python)。
(2) Server-Sent Events (SSE)
特点:单向(服务端→客户端),基于 HTTP 长连接,兼容性较好。
场景:股票行情、新闻推送。
协议:标准 HTTP。
示例:前端通过 EventSource API 监听服务端事件流。
(3) HTTP 长轮询(Long Polling)
特点:客户端发起请求后,服务端保持连接直到有数据返回。
场景:兼容旧浏览器的实时更新(如早期微信网页版)。
缺点:高延迟,服务端资源占用高。
2. 移动端与跨平台实时通讯
(1) 第三方 SDK
Firebase Cloud Messaging (FCM):Google 提供的推送服务(Android 优先)。
Apple Push Notification Service (APNs):iOS 系统级推送。
腾讯信鸽、极光推送:国内厂商的替代方案(解决 FCM 不可用问题)。
(2) 跨平台协议
MQTT:轻量级发布/订阅协议,适合物联网(低功耗、弱网络)。
库:Eclipse Paho(客户端)、Mosquitto(服务端)。
XMPP:基于 XML 的开放协议(如早期 WhatsApp)。
扩展:XMPP + WebSocket(如 Conversations 即时通讯应用)。
3. 音视频实时通讯(WebRTC)
(1) WebRTC
特点:浏览器原生支持,支持点对点(P2P)音视频传输。
场景:视频会议、在线教育(如 Zoom、腾讯会议)。
关键技术:
STUN/TURN:解决 NAT 穿透问题。
信令服务器:协商连接(可用 WebSocket 实现)。
库:
前端:浏览器原生 API、simple-peer。
后端:coturn(TURN 服务器)、mediasoup(SFU 架构)。
(2) 商业方案
声网(Agora):低延迟音视频 SDK。
Twilio Video:云服务 API。
腾讯云 TRTC:国内音视频解决方案。
4. 游戏与低延迟场景
(1) UDP 协议
特点:无连接、低延迟,但不可靠(需自行处理丢包)。
协议:
QUIC:Google 开发的基于 UDP 的协议(HTTP/3 底层)。
ENet:专为游戏设计的库(可靠 UDP)。
应用:MOBA 游戏、实时对战(如王者荣耀)。
(2) 自定义二进制协议
特点:高效压缩数据,减少传输量。
工具:Protocol Buffers、FlatBuffers 序列化。
框架:Netty(Java)、KCP(增强版 UDP)。
5. 分布式系统实时通讯
(1) 消息队列
Kafka:高吞吐量,适合日志、事件流。
RabbitMQ:低延迟,支持 AMQP 协议。
Pulsar:支持多租户和实时订阅。
(2) 实时数据库
Firebase Realtime Database:数据变更实时同步。
MongoDB Change Streams:监听数据库变化。
6. 其他新兴技术
gRPC-Web:基于 HTTP/2 的 RPC,支持双向流。
RSocket:反应式流协议,支持多路复用、熔断。
WebTransport:实验性协议(基于 QUIC),替代 WebSocket。
技术选型建议
场景 | 推荐技术 |
网页聊天室 | WebSocket + Socket.IO |
移动端推送 | FCM/APNs + 长连接保活 |
音视频通话 | WebRTC + TURN 服务器 |
物联网设备通信 | MQTT(弱网络) / CoAP(更轻量) |
高并发游戏后端 | UDP + 自定义协议(如 KCP) |
金融实时数据 | WebSocket + 二进制协议(Protobuf) |
示例:WebSocket 与 WebRTC 对比
特性 | WebSocket | WebRTC |
通信模式 | 客户端-服务端 | 点对点(P2P)或通过服务器中转 |
延迟 | 中等(依赖 TCP) | 极低(UDP) |
适用场景 | 文本/消息推送 | 音视频流、屏幕共享 |
复杂度 | 低 | 高(需处理 NAT 穿透) |
根据具体需求(延迟要求、平台兼容性、开发成本)选择合适的技术组合。例如:
- 聊天应用:WebSocket + MQTT(移动端保活)。
- 直播弹幕:WebSocket + HTTP 降级兼容。
- 智能家居:MQTT + WebSocket 网关。
三、什么是websocket
WebSocket 是一种基于 TCP 的全双工通信协议,允许在单个长连接上实现客户端(如浏览器)和服务端之间的双向实时数据传输。它是 HTML5 规范的一部分,旨在解决 HTTP 协议在实时通信中的局限性(如轮询效率低、服务端无法主动推送等问题)。
1. WebSocket 的核心特点
全双工通信
客户端和服务端可以同时发送和接收数据,无需像 HTTP 一样等待请求-响应周期。
低延迟
建立连接后,数据传输无需重复握手,适合实时性要求高的场景(如聊天、游戏)。
基于 TCP
工作在 OSI 模型的传输层,默认端口 80(WS)或 443(WSS)。
轻量级
数据帧头部仅 2~10 字节,比 HTTP 头部小得多,减少传输开销。
支持跨域
通过 Origin 头部控制安全策略(需服务端校验)。
2. WebSocket 协议详解
1. 握手阶段(HTTP Upgrade)
客户端通过 HTTP 请求发起协议升级:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
服务端响应确认升级:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
握手完成后,连接从 HTTP 切换到 WebSocket 协议。
2. 数据传输
数据帧:分为文本帧(UTF-8)、二进制帧、控制帧(如 Ping/Pong)。
掩码:客户端发送的数据必须掩码加密(防止缓存污染攻击)。
3. WebSocket 与 HTTP 对比
特性 | WebSocket | HTTP |
通信模式 | 全双工 | 半双工(请求-响应) |
连接生命周期 | 长连接(可持久化) | 短连接(每次请求后关闭) |
头部开销 | 2~10 字节/帧 | 几百字节/请求 |
服务端推送 | 原生支持 | 需依赖轮询/SSE |
适用场景 | 实时聊天、在线游戏、股票行情 | 静态资源获取、REST API |
4. WebSocket 应用场景
即时通讯
如微信网页版、Slack 的实时消息推送。
实时数据监控
股票行情、物联网设备状态更新。
在线协作工具
多人文档编辑(如 Google Docs)、白板共享。
游戏
多玩家实时交互(如网页版 MOBA 游戏)。
5. WebSocket 代码示例
客户端(浏览器 JavaScript)
const socket = new WebSocket("wss://example.com/chat");// 监听连接打开socket.onopen = () => {socket.send("Hello Server!");};// 接收消息socket.onmessage = (event) => {console.log("Received:", event.data);};// 错误处理socket.onerror = (error) => {console.error("WebSocket Error:", error);};
服务端(Node.js 使用 ws 库)
const WebSocket = require("ws");
const wss = new WebSocket.Server({ port: 8080 });wss.on("connection", (ws) => {ws.on("message", (message) => {console.log("Received:", message.toString());ws.send("Server: " + message); // 回显消息});
});
6. 常见问题与解决方案
连接稳定性
心跳机制:定期发送 Ping/Pong 帧检测连接存活。
断线重连:客户端监听 onclose 事件并自动重连。
安全性
使用 wss://(WebSocket over TLS)加密数据。
校验 Origin 防止跨站攻击(CSWSH)。
性能优化
二进制数据传输(如 Protocol Buffers)减少体积。
负载均衡:多个 WebSocket 服务器共享连接状态。
7. WebSocket 的局限性
浏览器兼容性:IE10+ 及现代浏览器支持。
代理问题:某些 HTTP 代理会阻断长连接。
无状态性:需自行实现会话管理(如基于 Cookie 或 Token)。
8. 替代方案对比
SSE(Server-Sent Events):仅服务端→客户端单向推送,基于 HTTP。
HTTP 长轮询:高延迟,适合兼容性要求高的场景。
WebRTC:点对点传输,适合音视频流(但复杂度更高)。
WebSocket 是构建实时 Web 应用的基石,结合后端框架(如 Socket.IO、Netty)可轻松实现高性能实时系统。
四、实现websocket的框架技术
实现 WebSocket 的框架和技术涵盖了从后端服务到前端客户端的全栈工具,不同语言和场景下有多种成熟方案可选。以下是主流的 WebSocket 实现框架和技术分类:
1. 后端 WebSocket 框架
1. Java 生态
(1) Netty
特点:高性能、异步事件驱动的 NIO 框架,内置 WebSocket 协议支持。
适用场景:高并发实时通信(如游戏服务器、IM 系统)。
示例代码:
// 创建 WebSocket 服务器public class WebSocketServer {public static void main(String[] args) {new ServerBootstrap().group(new NioEventLoopGroup()).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new HttpServerCodec()).addLast(new WebSocketServerProtocolHandler("/ws")).addLast(new SimpleChannelInboundHandler<TextWebSocketFrame>() {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {ctx.writeAndFlush(new TextWebSocketFrame("Server: " + msg.text()));}});}}).bind(8080);}}
(2) Spring WebSocket
特点:基于 Spring 生态,整合 STOMP 协议,适合企业级应用。
依赖:spring-boot-starter-websocket。
示例代码:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(new MyWebSocketHandler(), "/ws");}
}public class MyWebSocketHandler extends TextWebSocketHandler {@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) {session.sendMessage(new TextMessage("Echo: " + message.getPayload()));}
}
2. Node.js 生态
(1) ws 库
特点:轻量级原生 WebSocket 实现,性能高。
示例代码:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', (ws) => {ws.on('message', (message) => {ws.send(`Server: ${message}`);});
});
(2) Socket.IO
特点:兼容 WebSocket 和降级方案(如长轮询),支持房间、广播等高级功能。
示例代码:
const io = require('socket.io')(3000);io.on('connection', (socket) => {socket.emit('message', 'Connected!');socket.on('chat', (msg) => {io.emit('chat', msg); // 广播消息});});
2. 前端 WebSocket 技术
1. 原生 WebSocket API
浏览器内置支持,无需额外库。
示例代码:
const socket = new WebSocket('wss://example.com/ws');socket.onopen = () => socket.send('Hello!');socket.onmessage = (event) => console.log(event.data);
2. Socket.IO 客户端
特点:自动重连、多路复用、兼容性处理。
示例代码:
const socket = io('https://example.com');socket.emit('chat', 'Hello'); // 发送消息socket.on('reply', (data) => console.log(data));
3. 其他库
SockJS:兼容老旧浏览器的 WebSocket 模拟。
MQTT.js:物联网场景的轻量级协议。
3. 高级功能与优化技术
1. 协议扩展
STOMP:基于 WebSocket 的文本协议(适合消息中间件集成)。
WAMP:WebSocket 应用消息协议(支持 RPC 和 Pub/Sub)。
2. 性能优化
二进制数据传输:使用 ArrayBuffer 或 Protocol Buffers。
负载均衡:通过 Redis 共享 WebSocket 连接状态(如 socket.io-redis)。
3. 安全措施
TLS 加密:强制使用 wss://。
鉴权:在握手阶段验证 Token(如 JWT)。
限流:防止 DDoS 攻击(如限制连接数)。
4. 选型建议
场景 | 推荐技术 |
高并发后端(Java) | Netty |
全栈应用(JavaScript) | Socket.IO(前后端统一) |
轻量级服务(Go) | gorilla/websocket |
兼容老旧浏览器 | SockJS + Spring WebSocket |
物联网(低带宽) | MQTT over WebSocket |
5. 完整示例(Spring Boot + Vue.js)
后端(Spring Boot)
@RestControllerpublic class ChatController {@MessageMapping("/chat")@SendTo("/topic/messages")public String send(String message) {return "Echo: " + message;}}
前端(Vue.js)
const socket = new SockJS('/ws');const stompClient = Stomp.over(socket);stompClient.connect({}, () => {stompClient.subscribe('/topic/messages', (msg) => {console.log(msg.body);});stompClient.send("/app/chat", {}, "Hello!");});
通过选择合适的框架和技术组合,可以快速实现稳定、高性能的 WebSocket 应用。
五、怎么实现HTTP长轮询
HTTP 长轮询(Long Polling)是一种模拟实时通信的技术,客户端向服务器发送请求后,服务器会保持连接打开,直到有数据可返回或超时。相比传统轮询(频繁请求),长轮询减少了无效请求,降低了延迟。以下是实现 HTTP 长轮询的详细步骤和代码示例。
1. 基本原理
客户端:发送一个 HTTP 请求,服务器不立即响应,而是挂起连接。
服务端:当有新数据时,立即返回响应;否则保持连接直到超时(如 30 秒)。
客户端:收到响应后,立即发起新的请求,维持“长连接”效果。
2. 服务端实现(以 Node.js 为例)
使用 Express 实现长轮询
const express = require('express');const app = express();const port = 3000;// 存储挂起的请求和最新数据let pendingRequests = [];let latestData = null;// 客户端发起长轮询请求app.get('/poll', (req, res) => {// 如果有新数据,立即返回if (latestData) {res.json({ data: latestData });latestData = null; // 清空数据} else {// 否则挂起请求pendingRequests.push(res);// 设置超时(例如 30秒后自动返回空响应)setTimeout(() => {if (pendingRequests.includes(res)) {res.status(304).end(); // 返回 304 表示无新数据pendingRequests = pendingRequests.filter(r => r !== res);}}, 30000);}});// 模拟数据更新(例如通过另一个接口)app.post('/update', (req, res) => {latestData = { time: new Date().toISOString() };// 触发所有挂起的请求返回pendingRequests.forEach(res => res.json({ data: latestData }));pendingRequests = []; // 清空挂起队列res.send('Data updated');});app.listen(port, () => {console.log(`Server running at http://localhost:${port}`);});
关键点
挂起请求:用数组 pendingRequests 存储未完成的响应对象(res)。
数据更新触发:当 /update 被调用时,立即返回所有挂起的请求。
超时处理:避免连接永久挂起(如 30 秒后自动释放)。
3. 客户端实现(JavaScript)
function longPoll() {fetch('/poll').then(response => {if (response.status === 200) {return response.json();} else {return null; // 304 或超时}}).then(data => {if (data) {console.log('Received:', data);} else {console.log('No new data');}// 无论有无数据,立即发起下一次请求longPoll();}).catch(error => {console.error('Polling error:', error);// 错误后延迟重试setTimeout(longPoll, 1000);});}// 启动长轮询longPoll();
关键点
递归调用:每次请求结束后立即发起下一次请求。
错误处理:网络异常时延迟重试。
数据渲染:根据返回的 data 更新页面。
4. 优化与注意事项
(1) 服务端优化
内存管理:避免 pendingRequests 堆积(如限制最大挂起数)。
超时时间:根据业务调整(太短会增加请求次数,太长可能占用资源)。
主动关闭:在服务端异常时手动终止挂起的 res。
(2) 客户端优化
取消请求:页面离开时终止未完成的请求(用 AbortController)。
const controller = new AbortController();fetch('/poll', { signal: controller.signal }).then(...).catch(e => {if (e.name === 'AbortError') console.log('Request aborted');});// 页面卸载时取消window.addEventListener('beforeunload', () => controller.abort());
心跳检测:长时间无响应时主动重连。
5. 对比其他技术
技术 | 优点 | 缺点 |
HTTP 长轮询 | 兼容性好(所有浏览器支持) | 高延迟,服务端资源占用高 |
WebSocket | 全双工、低延迟 | 需要协议升级(非 HTTP) |
Server-Sent Events (SSE) | 单向实时流(服务端→客户端) | 不支持双向通信 |
6. 适用场景
兼容性要求高:支持老旧浏览器(如 IE9)。
简单实时更新:通知、订单状态变更。
替代 WebSocket:在不支持 WebSocket 的环境(如某些代理服务器)。
完整流程图
通过以上代码和优化策略,可以高效实现 HTTP 长轮询。对于现代应用,建议优先考虑 WebSocket 或 SSE,但在特殊场景下长轮询仍是可靠的备选方案。
六、聊聊四种实时通信技术
四种实时通信技术:短轮询、长轮询、WebSocket 和 SSE 。
1. 短轮询
浏览器 定时(如每秒)向服务器发送 HTTP 请求,服务器立即返回当前数据(无论是否有更新)。
优点:实现简单,兼容性极佳
缺点:高频请求浪费资源,实时性差(依赖轮询间隔)
延迟:高(取决于轮询频率)
适用场景:兼容性要求高,延迟不敏感的简单场景。
笔者职业生涯印象最深刻的短轮询应用场景是比分直播:
如图所示,用户进入比分直播界面,浏览器定时查询赛事信息(比分变动、黄红牌等),假如数据有变化,则重新渲染页面。
这种方式实现起来非常简单可靠,但是频繁的调用后端接口,会对后端性能会有影响(主要是 CPU)。同时,因为依赖轮询间隔,页面数据变化有延迟,用户体验并不算太好。
2. 长轮询
浏览器发送 HTTP 请求后,服务器 挂起连接 直到数据更新或超时,返回响应后浏览器立即发起新请求。
优点:减少无效请求,比短轮询实时性更好
缺点:服务器需维护挂起连接,高并发时资源消耗大
延迟:中(取决于数据更新频率)
适用场景:需要较好实时性且无法用 WebSocket/SSE 的场景(如消息通知)
长轮询最常见的应用场景是:配置中心,我们耳熟能详的注册中心 Nacos 、阿波罗都是依赖长轮询机制。
Nacos长轮询
客户端发起请求后,Nacos 服务端不会立即返回请求结果,而是将请求挂起等待一段时间,如果此段时间内服务端数据变更,立即响应客户端请求,若是一直无变化则等到指定的超时时间后响应请求,客户端重新发起长轮询。
3. WebSocket
基于 TCP 的全双工协议,通过 HTTP 升级握手(Upgrade: websocket)建立持久连接(双向实时通信)。
优点:最低延迟,支持双向交互,节省带宽
缺点:实现复杂,需单独处理连接状态
延迟:极低
适用场景:聊天室、在线游戏、协同编辑等 高实时双向交互 需求
笔者曾经服务于北京一家电商公司,参与直播答题功能的研发。
直播答题整体架构见下图:
TCP 网关的技术选型是:Netty、ProtoBuf、WebSocket ,选择 WebSocket 是因为它支持双向实时通信,同时 Netty 内置了 WebSocket 实现类,工程实现起来相对简单。
4. Server Send Event(SSE)
基于 HTTP 协议,服务器可 主动推送 数据流(如Content-Type: text/event-stream),浏览器通过EventSource API 监听。
优点:原生支持断线重连,轻量级(HTTP协议)
缺点:单向通信(服务端--》客户端),低版本 IE 浏览器不支持
延迟:低(服务器可即时推送)
适用场景:股票行情、实时日志等 服务器单向推送 需求。
SSE 最经典的应用场景是 : DeepSeek web 聊天界面 ,如图所示:
当在 DeepSeek 对话框发送消息后,浏览器会发送一个 HTTP 请求 ,服务端会通过 SSE 方式将数据返回到浏览器。
5. 总结
特性 | 短轮询 | 长轮询 | SSE | WebSocket |
协议 | HTTP | HTTP | HTTP | WebSocket(基于TCP) |
实时性 | 低 | 中 | 高 | 极高 |
资源消耗 | 高(频繁请求) | 中(挂起连接) | 低 | 低(长连接) |
选择建议:
需要 简单兼容性 → 短轮询
需要 中等实时性 → 长轮询
只需 服务器推送 → SSE
需要 全双工实时交互 → WebSocket
原文地址:聊聊四种实时通信技术:短轮询、长轮询、WebSocket 和 SSE
问:
这篇文章,讲了短轮询通讯技术,短轮询是否算得上一个通讯技术聊聊四种实时通信技术:短轮询、长轮询、WebSocket 和 SSE
短轮询(Short Polling)确实是一种通讯技术,但其设计理念和适用场景与真正的“实时通讯”技术(如WebSocket、长轮询等)有显著差异。以下是针对该问题的详细分析:
1. 短轮询的本质
短轮询的核心是客户端定期向服务器发送HTTP请求(例如每秒一次),服务器立即返回当前数据(无论是否有更新)。
技术定位:
属于 “客户端主动拉取” 模式,而非服务端主动推送。
本质上是 “伪实时”,依赖高频请求模拟实时效果。
是否算通讯技术?
✅ 是,但属于最简单的请求-响应模式,而非现代意义上的实时通讯技术。
2. 短轮询 vs. 长轮询 vs. WebSocket
特性 | 短轮询 | 长轮询 | WebSocket |
通信模式 | 客户端高频轮询 | 服务端挂起连接直至有数据 | 全双工长连接 |
实时性 | 延迟高(依赖轮询间隔) | 中等(减少无效请求) | 真正实时(毫秒级) |
服务端压力 | 高(大量无效请求) | 中等(连接挂起) | 低(单连接持久化) |
适用场景 | 数据更新不频繁的简单场景 | 兼容性要求高的实时场景 | 高性能实时应用 |
3. 短轮询的典型应用场景
尽管效率低,短轮询仍有其适用场景:
兼容性优先:
所有浏览器和服务器均支持(无需特殊协议或库)。
低频更新需求:
例如天气预报每小时更新一次,轮询间隔设为1小时。
快速原型开发:
临时方案,后期可替换为长轮询或WebSocket。
4. 短轮询的缺陷
资源浪费:
即使数据未更新,客户端仍会发送请求,消耗带宽和服务器资源。
延迟问题:
若轮询间隔为5秒,用户可能最多需要等待5秒才能看到新数据。
扩展性差:
高并发场景下,服务器可能被海量轮询请求压垮。
5. 技术实现示例(Node.js)
服务端代码
const express = require('express');const app = express();let data = { value: 'Initial Data' };// 短轮询接口app.get('/poll', (req, res) => {res.json(data); // 每次请求都立即返回当前数据});// 模拟数据更新setInterval(() => {data.value = `Updated at ${new Date().toLocaleTimeString()}`;}, 5000); // 每5秒更新一次数据app.listen(3000, () => console.log('Server running'));
客户端代码
function shortPoll() {fetch('/poll').then(res => res.json()).then(data => {console.log('Current data:', data);setTimeout(shortPoll, 1000); // 每隔1秒轮询一次});}shortPoll();
6. 何时选择短轮询?
数据更新频率低(如每几分钟一次)。
无需真正实时性(用户可容忍秒级延迟)。
开发资源有限(快速实现,无需复杂架构)。
7. 替代方案建议
若需更高效率,可逐步迁移至:
长轮询:减少无效请求。
Server-Sent Events (SSE):服务端单向推送。
WebSocket:全双工实时通信。
结论
短轮询是一种基础的通讯技术,适合简单场景,但在实时性和资源消耗上存在明显短板。现代应用更推荐使用长轮询、SSE或WebSocket,根据实际需求权衡兼容性与性能。
七、长轮询与短轮询的区别
长轮询(Long Polling)和短轮询(Short Polling)都是客户端与服务器交互的技术,用于模拟实时数据更新,但两者的工作机制、性能和应用场景有显著差异。以下是它们的核心区别:
1. 工作机制对比
特性 | 短轮询 | 长轮询 |
请求方式 | 客户端定期发送请求(如每秒1次) | 客户端发送请求后,服务器保持连接挂起,直到有数据或超时 |
响应时机 | 服务器立即返回当前数据(无论是否有更新) | 服务器仅在数据更新或超时时返回响应 |
连接状态 | 短连接(每次请求后关闭) | 长连接(请求挂起期间保持打开) |
实时性 | 延迟高(依赖轮询间隔) | 延迟较低(接近实时) |
2. 性能与资源消耗
维度 | 短轮询 | 长轮询 |
网络开销 | 高(频繁建立/关闭连接) | 中(减少无效请求) |
服务器压力 | 高(处理大量无效请求) | 中(连接挂起消耗资源较少) |
客户端资源 | 高(CPU/带宽占用多) | 低(仅在数据到达时处理) |
3. 典型应用场景
技术 | 适用场景 | 不适用场景 |
短轮询 | - 数据更新频率低(如每5分钟一次) | 高频实时更新(如聊天、股票行情) |
长轮询 | - 需要接近实时的更新(如消息通知) | 严格实时需求(如音视频流) |
4. 代码实现对比
短轮询示例(客户端JavaScript)
// 每2秒请求一次数据setInterval(() => {fetch('/api/data').then(response => response.json()).then(data => console.log('Data:', data));}, 2000);
长轮询示例(服务端Node.js)
// 服务端挂起请求直到数据更新app.get('/api/long-poll', (req, res) => {const checkData = () => {if (dataUpdated) {res.json({ data: latestData });} else {setTimeout(checkData, 1000); // 每隔1秒检查一次数据}};checkData();});
5. 优缺点总结
技术 | 优点 | 缺点 |
短轮询 | - 实现简单 | - 高延迟 |
长轮询 | - 减少无效请求 | - 服务端需维护挂起连接 |
6. 如何选择?
选短轮询:
数据更新频率低(如天气预报)。
无法修改服务端(仅支持简单HTTP请求)。
选长轮询:
需要接近实时的体验(如聊天室新消息)。
能控制服务端逻辑(支持连接挂起)。
更优方案:
严格实时场景(如在线游戏)→ WebSocket
服务端单向推送(如股票行情)→ SSE(Server-Sent Events)
7. 可视化流程对比
短轮询
长轮询
总结
短轮询是“频繁敲门问数据”,简单但低效。
长轮询是“等在门口直到有数据”,减少无效交互。
根据业务需求选择,现代应用更推荐 WebSocket 或 SSE 实现真正实时。
8. 使用java实现长轮询和短轮询
以下是使用 Java 实现 短轮询 和 长轮询 的完整代码示例,包括服务端和客户端的实现,并附有详细注释说明。
1. 短轮询(Short Polling)
短轮询的核心是 客户端定时发送请求,服务端立即返回当前数据(无论是否有更新)。
服务端实现(Spring Boot)
import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.time.LocalDateTime;@RestControllerpublic class ShortPollingController {private String latestData = "Initial Data";// 模拟数据更新(每5秒更新一次)@GetMapping("/update-data")public String updateData() {latestData = "Updated at: " + LocalDateTime.now();return "Data updated!";}// 短轮询接口(客户端定期调用)@GetMapping("/short-poll")public String getData() {return latestData; // 每次请求都立即返回当前数据}}
客户端实现(Java + HttpClient)
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.time.Duration;public class ShortPollingClient {public static void main(String[] args) throws InterruptedException {HttpClient client = HttpClient.newHttpClient();String url = "http://localhost:8080/short-poll";// 每2秒轮询一次while (true) {HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).timeout(Duration.ofSeconds(10)).build();client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println).join();Thread.sleep(2000); // 轮询间隔}}}
短轮询特点
优点:实现简单,兼容性好。
缺点:频繁无效请求,资源浪费。
2. 长轮询(Long Polling)
长轮询的核心是 客户端发送请求后,服务端挂起连接,直到数据更新或超时再响应。
服务端实现(Spring Boot + DeferredResult)
import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.context.request.async.DeferredResult;import java.time.LocalDateTime;import java.util.concurrent.CompletableFuture;@RestControllerpublic class LongPollingController {private String latestData = "Initial Data";private DeferredResult<String> deferredResult;// 模拟数据更新(触发长轮询响应)@GetMapping("/update-data")public String updateData() {latestData = "Updated at: " + LocalDateTime.now();if (deferredResult != null) {deferredResult.setResult(latestData); // 触发挂起的请求返回deferredResult = null;}return "Data updated!";}// 长轮询接口(挂起请求直到数据更新或超时)@GetMapping("/long-poll")public DeferredResult<String> longPoll() {DeferredResult<String> result = new DeferredResult<>(30_000L, "Timeout"); // 超时30秒deferredResult = result;// 模拟异步检查数据更新CompletableFuture.runAsync(() -> {try {Thread.sleep(1000); // 每隔1秒检查一次数据} catch (InterruptedException e) {Thread.currentThread().interrupt();}});return result;}}
客户端实现(Java + HttpClient)
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;public class LongPollingClient {public static void main(String[] args) {HttpClient client = HttpClient.newHttpClient();String url = "http://localhost:8080/long-poll";while (true) {HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).timeout(Duration.ofSeconds(35)) // 超时略大于服务端.build();client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(data -> {System.out.println("Received: " + data);if (!data.equals("Timeout")) {// 立即发起下一次长轮询main(null);}}).join();}}}
长轮询特点
优点:减少无效请求,接近实时。
缺点:服务端需维护挂起连接,实现复杂。
3. 对比与选择
维度 | 短轮询 | 长轮询 |
实时性 | 低(依赖轮询间隔) | 中(接近实时) |
服务端压力 | 高(频繁处理请求) | 中(连接挂起消耗资源) |
适用场景 | 低频更新(如每5分钟一次) | 需快速响应(如聊天消息通知) |
4. 更优替代方案
WebSocket:全双工实时通信(Spring WebSocket示例)。
https://spring.io/guides/gs/messaging-stomp-websocket
SSE(Server-Sent Events):服务端单向推送(适合股票行情等场景)。
总结
短轮询适合兼容性要求高、数据更新慢的场景。
长轮询适合需要减少无效请求的准实时场景。
生产环境推荐 WebSocket 或 SSE 实现真正实时。
八、常见协议
以下是按首字母排序的常见传输协议列表,涵盖网络通信、实时传输、文件传输等多种场景:
A
协议名称 全称/描述 典型应用场景
ARP Address Resolution Protocol IP地址 → MAC地址解析
AMQP Advanced Message Queuing Protocol 消息队列(RabbitMQ等)
B
| BGP | Border Gateway Protocol | 互联网AS自治系统间路由 |
| BitTorrent | P2P文件分发协议 | 大文件共享 |
C
| CoAP | Constrained Application Protocol | 物联网(低功耗设备) |
| DNS | Domain Name System | 域名解析 |
| DHCP | Dynamic Host Configuration Protocol | 动态分配IP地址 |
F
| FTP | File Transfer Protocol | 文件传输(明文) |
| FTPS | FTP over SSL/TLS | 加密文件传输 |
H
| HTTP | Hypertext Transfer Protocol | 网页浏览 |
| HTTPS | HTTP over SSL/TLS | 安全网页传输 |
| HTTP/2 | HTTP 2.0(多路复用) | 高性能Web服务 |
| HTTP/3 | HTTP over QUIC(基于UDP) | 低延迟Web传输 |
I
| ICMP | Internet Control Message Protocol | 网络诊断(Ping/Traceroute)|
| IMAP | Internet Message Access Protocol | 电子邮件接收 |
M
| MQTT | Message Queuing Telemetry Transport | 物联网(轻量级发布/订阅) |
| Modbus | 工业设备通信协议 | 工业自动化 |
N
| NTP | Network Time Protocol | 时间同步 |
P
| POP3 | Post Office Protocol v3 | 电子邮件下载 |
| QUIC | Quick UDP Internet Connections | HTTP/3底层协议 |
R
| RTP | Real-time Transport Protocol | 音视频流传输 |
| RTSP | Real Time Streaming Protocol | 视频监控/流媒体 |
| RTMP | Real-Time Messaging Protocol | 直播推流(Adobe) |
| RSocket | Reactive Streams协议 | 双向异步通信 |
S
| SMTP | Simple Mail Transfer Protocol | 电子邮件发送 |
| SSH | Secure Shell | 加密远程登录 |
| SNMP | Simple Network Management Protocol | 网络设备监控 |
| SMB | Server Message Block | 局域网文件共享(Windows) |
| STOMP | Simple Text Oriented Messaging Protocol| 消息中间件(如ActiveMQ) |
T
| TCP | Transmission Control Protocol | 可靠数据传输 |
| TELNET | 明文远程登录协议 | 旧式设备管理(不安全) |
| TFTP | Trivial File Transfer Protocol | 简单文件传输(无认证) |
U
| UDP | User Datagram Protocol | 低延迟非可靠传输 |
W
| WebSocket | 全双工通信协议(基于TCP) | 实时聊天、游戏 |
| WebRTC | Web Real-Time Communication | 浏览器音视频P2P通信 |
| WSS | WebSocket Secure | 加密WebSocket连接 |
X
| XMPP | Extensible Messaging and Presence Protocol | 即时通讯(如早期GTalk) |
其他
| gRPC | Google Remote Procedure Call | 高性能RPC(基于HTTP/2) |
| LDAP | Lightweight Directory Access Protocol | 目录服务认证 |
分类总结
传输层协议:TCP、UDP、QUIC
应用层协议:HTTP、FTP、MQTT、WebSocket
实时通信:RTP、RTSP、WebRTC
物联网:CoAP、MQTT
文件/邮件传输:FTP、SMTP、IMAP
九、Coturn 介绍
Coturn 介绍:WebRTC 的 NAT 穿透与中继服务器
Coturn(原名 rfc5766-turn-server)是一个开源的 TURN/STUN 服务器,专门用于解决 WebRTC、VoIP 等实时通信中的 NAT 穿透问题。当 P2P(点对点)直连失败时,Coturn 作为中继服务器转发音视频数据,确保通话连通性。
1. Coturn 的核心功能
功能 | 作用 |
STUN | 获取客户端的公网 IP 和端口,尝试 NAT 穿透(轻量级,不转发数据)。 |
TURN | 当 P2P 失败时,通过中继服务器转发音视频/数据流(确保连通性,但增加延迟)。 |
ICE 协议支持 | 集成 ICE(Interactive Connectivity Establishment)框架,自动选择最优传输路径。 |
DTLS/TLS 加密 | 支持加密传输(WebRTC 强制要求)。 |
多线程高性能 | 可处理数千并发连接,适合大规模应用。 |
2. 为什么需要 Coturn?
NAT 穿透失败场景:
对称型 NAT(Symmetric NAT)严格限制 P2P 连接。
防火墙阻止直连(如企业网络)。
WebRTC 的强制要求:
浏览器要求至少配置一个 TURN 服务器作为备用方案。
全球覆盖优化:
通过部署多地 TURN 服务器减少延迟(如用户 A 在中国,用户 B 在美国)。
3. Coturn 的安装与配置
安装步骤(Ubuntu/Debian)
# 安装依赖和 Coturnsudo apt updatesudo apt install coturn# 启用服务sudo systemctl enable coturnsudo systemctl start coturn
基础配置(/etc/turnserver.conf)
# 监听端口(默认 3478 UDP/TCP)listening-port=3478tls-listening-port=5349# 域名和证书(TLS 必需)realm=yourdomain.comcert=/path/to/cert.pempkey=/path/to/private.key# 长期认证机制(WebRTC 常用)lt-cred-mechuser=username:password# 或动态生成密码(推荐)use-auth-secretstatic-auth-secret=your_shared_secret# 中继 IP(服务器公网 IP)external-ip=YOUR_SERVER_PUBLIC_IP
启动命令
turnserver -c /etc/turnserver.conf
4. 与 WebRTC 集成
在 WebRTC 的 ICE Servers 配置中添加 Coturn 服务器:
const pc = new RTCPeerConnection({iceServers: [{ urls: "stun:stun.yourdomain.com" }, // STUN 服务器{urls: "turn:turn.yourdomain.com", // TURN 服务器username: "username",credential: "password"}]});
5. 性能优化与安全
性能优化
多线程模式:
threads=4 # 根据 CPU 核心数调整
带宽限制(避免滥用):
max-bps=500000 # 限制单个连接带宽(bps)
日志管理:
no-stdout-log # 禁用控制台日志
log-file=/var/log/turn.log
安全配置
防火墙规则:
sudo ufw allow 3478/udp # STUN/TURN UDP
sudo ufw allow 5349/tcp # TLS over TCP
防止滥用:
no-multicast-peers
no-loopback-peers
6. Coturn 的替代方案
方案 | 特点 |
Google STUN | 免费 STUN 服务器(stun.l.google.com:19302),但无 TURN 中继功能。 |
Twilio TURN | 商业服务,提供全球分布式 TURN 服务器(按流量收费)。 |
自建其他实现 | 如 Pion TURN(Go 语言库)。 |
7. 常见问题
Q1: Coturn 如何调试?
sudo turnserver -c /etc/turnserver.conf -v # 启用详细日志
检查日志中的 ERROR 或 WARNING,常见问题包括:
证书路径错误
防火墙未开放端口
配置文件中 external-ip 未设置
Q2: 如何测试 TURN 服务器?
使用 Trickle ICE 工具,输入服务器信息后检查 relay 候选地址是否出现。
Q3: 为什么 WebRTC 仍失败?
确保客户端配置了 TURN(而不仅是 STUN)。
检查 TURN 服务器的带宽和负载(top -i 查看 CPU 使用率)。
总结
Coturn 是 WebRTC 实时通信的关键基础设施,尤其在复杂网络环境下保障通话连通性。通过合理配置和优化,可支持高并发、低延迟的音视频传输。对于生产环境,建议:
部署多个 Coturn 节点(多地容灾)。
监控服务器负载(如 Prometheus + Grafana)。
定期更新证书和密码。
十、Protocol Buffers (PB) 协议详解
Protocol Buffers (简称PB或protobuf) 是Google开发的一种高效的数据序列化协议,广泛应用于网络通信和数据存储领域。融云IM等许多即时通讯系统都采用PB作为其核心通信协议。
1、PB协议基本概念
1. 什么是PB协议
一种语言中立、平台中立、可扩展的结构化数据序列化机制
比XML、JSON更小、更快、更简单
通过预定义Schema(.proto文件)来结构化数据
2. 核心特点
高效性:二进制格式,体积小,编解码快
跨语言:支持Java、C++、Python、Go等主流语言
可扩展:兼容新旧版本的数据结构
强类型:编译时类型检查
2、PB协议工作原理
1. 定义消息格式(.proto文件)
message Person {required string name = 1;optional int32 id = 2;repeated string email = 3;enum PhoneType {MOBILE = 0;HOME = 1;WORK = 2;}message PhoneNumber {required string number = 1;optional PhoneType type = 2 [default = HOME];}repeated PhoneNumber phone = 4;}
2. 字段标识与类型系统
字段编号:每个字段有唯一数字标识(如=1),用于二进制编码
字段规则:
required:必须字段
optional:可选字段
repeated:可重复字段(数组)
数据类型:
标量类型:int32, int64, float, double, bool, string, bytes等
复合类型:嵌套message,enum
3. 编码原理
PB采用Tag-Length-Value(TLV)编码格式:
Tag:字段编号 + 数据类型(wire type)
Length:对于变长类型(string, bytes等)
Value:字段实际值
编码特点:
变长整数编码(Varint):小数值占用更少字节
字段编号代替字段名:大幅减少数据量
默认值不编码:节省空间
3、PB在IM系统中的应用
1. 消息结构示例
message IMMessage {required string msgId = 1; // 消息IDrequired string fromUserId = 2; // 发送者IDrequired string toUserId = 3; // 接收者IDrequired int64 timestamp = 4; // 时间戳required MsgType type = 5; // 消息类型enum MsgType {TEXT = 0;IMAGE = 1;VOICE = 2;VIDEO = 3;}oneof content {string text = 6;bytes imageData = 7;bytes voiceData = 8;VideoInfo video = 9;}optional int32 status = 10; // 消息状态}
2. IM系统中的优势
高压缩率:相比JSON可减少30%-50%的数据量
对移动网络环境特别重要
快速编解码:提升消息处理速度
编解码速度比JSON快5-100倍
强类型安全:减少客户端错误
协议扩展性:兼容新旧客户端版本
3. 实际应用场景
消息传输
用户状态同步
群组信息更新
离线消息拉取
4、PB与其他协议对比
特性 | PB | JSON | XML |
数据格式 | 二进制 | 文本 | 文本 |
大小 | 很小 | 大 | 很大 |
解析速度 | 非常快 | 中等 | 慢 |
可读性 | 不可读 | 易读 | 易读 |
类型检查 | 编译时 | 运行时 | 运行时 |
扩展性 | 优秀 | 一般 | 好 |
5、PB使用最佳实践
合理设计.proto文件
为未来扩展预留字段编号
避免频繁修改required字段
版本兼容性处理
新版本客户端应能处理旧版本消息
旧版本客户端应能忽略无法识别的字段
性能优化
对于大消息考虑分片传输
复用protobuf对象减少内存分配
安全考虑
验证消息大小防止DoS攻击
对敏感字段考虑加密
PB协议因其高效性和跨平台特性,成为现代IM系统首选的通信协议,特别适合对性能和带宽有严格要求的移动即时通讯场景。
6、融云IM客户端使用的通信技术
融云IM客户端使用了多种现代通信技术来实现高效、可靠的即时通讯功能,主要包括以下核心技术:
核心通信技术
1.WebSocket协议
作为主要的长连接通信通道
提供全双工通信能力
实现消息的实时推送和接收
2.HTTP/HTTPS协议
用于短连接请求,如登录、获取历史消息等
保障数据传输的安全性
3.TCP/IP协议
底层传输协议
提供可靠的、面向连接的数据传输
4.MQTT协议(部分场景)
用于特定场景下的轻量级消息传输
特别适合移动设备和低带宽环境
高级通信技术
1.连接复用技术
多路复用单条TCP连接
减少连接建立的开销
2.智能心跳机制
动态调整心跳间隔
平衡功耗和连接保持
3.数据压缩技术
消息体压缩减少数据传输量
特别适用于图片、文件等大消息
4.二进制协议
自定义二进制协议提高传输效率
减少数据包大小
5.多通道传输
自动选择最佳传输通道(WebSocket/HTTP长轮询等)
根据网络环境动态切换
优化技术
1.QoS保障机制
消息可达性保障
消息重传和确认机制
2.断网自动恢复
网络中断后自动重连
消息重发机制
3.多级缓存
本地消息缓存
减少网络请求
4.差分更新
只传输变化的数据
减少带宽消耗
这些技术的综合运用使融云IM客户端能够在各种网络环境下提供稳定、高效的即时通讯服务。