Long-Polling vs WebSockets,如何选择?
时间:2026-09-20 07:59 来源:未知 人气:
Long-Polling(长轮询)和 WebSockets 是客户端和服务器之间实时通信的两种常见方法,这篇文章,我们将探讨这两种技术的区别、各自的架构、优点、缺点以及适用的使用场景。
一、什么是实时通信?
实时通信指的是服务器能够在信息可用时立即推送给客户端,而无需客户端显式请求。
这与传统的 HTTP请求-响应模型形成对比,在传统模型中,客户端必须始终发起通信,而长轮询和 WebSockets可以克服这种限制。
客户端和服务器之间的实时通信对于聊天应用程序、体育赛事直播、股票行情、在线游戏和协作工具等应用程序至关重要。
二、长轮询
长轮询是指客户端向服务器发送 HTTP请求,服务器保持该请求直到有新数据可用,一旦服务器有新数据,它会响应客户端,客户端立即发送新请求。这样就创建了一个持续的连接以实现实时更新。
1.工作原理
- 客户端向服务器发送请求。
- 服务器不会立即响应,而是保持请求并等待数据可用。
- 当数据可用时(或在超时后),服务器响应请求。
- 客户端立即发送另一个请求,重新开始该过程。
2.优点
- 简单性:易于使用标准HTTP基础设施实现。
- 兼容性:无需额外配置即可与现有防火墙和代理服务器配合工作。
- 备选方案:可以作为不支持 WebSockets的环境中的备选方案。
3.缺点
- 延迟:由于需要建立新的 HTTP连接,延迟较高。
- 开销:频繁的 HTTP请求和响应带来较高的开销。
- 可扩展性:由于大量打开的 HTTP连接和服务器资源消耗,难以扩展。
4.何时使用长轮询?
- 当你需要支持不支持 WebSockets的旧浏览器或环境时。
- 对于更新不频繁,近实时足够的应用程序。
- 使用不支持 WebSockets的现有基础设施时。
- 对于简单应用程序,不需要 WebSockets的复杂性。
5.示例
如下示例代码,用 Java模拟了一个长轮询的方式,当服务器接收到客户端的请求时,服务器会将请求写入
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
@RestController
public class LongPollingController {
// 用于存储消息的队列
private final BlockingQueueString messageQueue = new LinkedBlockingQueue();
// 模拟一个接收消息的端点
@GetMapping("/receive")
public String receive() throws InterruptedException {
// 如果队列为空,等待新的消息
return messageQueue.take();
}
// 模拟一个发送消息的端点
@GetMapping("/send")
public String send(String message) {
messageQueue.offer(message);
return "Message sent!";
}
}