长轮询 vs SSE vs WebSocket:实时通信怎么选
HttpAgent 对长轮询、Server-Sent Events 与 WebSocket 三种实时通信方式提供了统一支持。本文对比三者的原理、适用场景与选择建议。H团
HttpAgent 团队
实时通信场景下,开发者常常在长轮询、SSE(Server-Sent Events) 与 WebSocket 之间犹豫。三者 HttpAgent 全部支持,且 API 风格一致:都是「构建器 + 事件处理器」。
三种方式对比#
| 维度 | 长轮询 Long Polling | SSE | WebSocket |
|---|---|---|---|
| 方向 | 客户端轮询 | 服务端 → 客户端单向 | 双向全双工 |
| 协议 | 普通 HTTP | HTTP(text/event-stream) | ws / wss 升级 |
| 代理/防火墙 | 完全兼容 | 兼容 | 偶有拦截 |
| 适用 | 低频更新、兼容优先 | AI 流式输出、消息推送 | 聊天、游戏、协作 |
长轮询:兼容性最好的兜底方案#
请求发出后服务端挂起,直到有新数据或超时;客户端收到响应后立即发起下一次请求。
await httpRemoteService.LongPollingAsync( "https://api.example.com/events", new HttpLongPollingBuilder() .SetInterval(TimeSpan.FromSeconds(15)) // 轮询间隔 .SetOnResponse((response, token) => { Console.WriteLine(response.StatusCode); return Task.CompletedTask; }));SSE:AI 时代的主力军#
大模型流式输出(如 DeepSeek)正是 SSE 的典型场景:服务端持续推送 data: 事件,客户端逐 token 渲染。
await httpRemoteService.ServerSentEventsAsync("https://api.deepseek.com/chat", new HttpServerSentEventsBuilder() .SetOnOpen(() => Console.WriteLine("已连接")) .SetOnMessage((data, token) => { Console.Write(data.Data); // 逐段输出 AI 回复 return Task.CompletedTask; }));WebSocket:需要双向交互时#
聊天、在线协作、实时游戏等需要「客户端主动推 + 服务端主动推」的场景,WebSocket 是不二之选。
var client = new WebSocketClient("wss://example.com/ws", options);client.OnMessage += (sender, e) => Console.WriteLine(e.Message);await client.ConnectAsync();await client.SendAsync("hello");