HTTP、WebSocket、SSE 对比
特性 | HTTP | WebSocket | SSE (Server-Sent Events) |
---|---|---|---|
通信模式 | 请求-响应(单向) | 全双工双向通信 | 服务器到客户端的单向通信 |
连接方式 | 短连接(默认) | 长连接 | 长连接 |
协议基础 | TCP(HTTP/1.1, HTTP/2) | 基于HTTP升级 | 基于HTTP |
数据格式 | 任意格式 | 二进制或文本 | 文本(text/event-stream ) |
实时性 | 低(依赖轮询) | 高(毫秒级延迟) | 中(服务器主动推送) |
浏览器支持 | 所有浏览器 | 现代浏览器 | 现代浏览器(IE除外) |
优缺点对比
协议 | 优点 | 缺点 |
---|---|---|
HTTP | ✅ 简单易用 ✅ 无状态易扩展 ✅ 缓存支持 | ❌ 实时性差 ❌ 频繁请求开销大 |
WebSocket | ✅ 全双工实时通信 ✅ 低延迟 ✅ 高效(减少头开销) | ❌ 实现复杂 ❌ 无自动重连机制 |
SSE | ✅ 自动重连 ✅ 简单易用(HTTP基础) ✅ 轻量级推送 | ❌ 单向通信(服务器→客户端) ❌ 文本格式限制 |
应用场景
- HTTP:常规API请求、静态资源加载、表单提交
- WebSocket:在线聊天、实时游戏、协同编辑
- SSE:实时通知、股票行情推送、新闻更新
简易Java案例
1. HTTP Server (Java Servlet)
@WebServlet("/http")
public class HttpServletDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {resp.setContentType("text/plain");resp.getWriter().write("HTTP Response: " + new Date());}
}
# 测试命令
curl http://localhost:8080/http
2. WebSocket Server (Jakarta EE)
@ServerEndpoint("/ws")
public class WebSocketServer {@OnOpenpublic void onOpen(Session session) {System.out.println("WebSocket connected");}@OnMessagepublic void onMessage(String message, Session session) {try {session.getBasicRemote().sendText("Echo: " + message);} catch (IOException e) {e.printStackTrace();}}
}
<!-- 客户端测试 -->
<script>const ws = new WebSocket("ws://localhost:8080/ws");ws.onmessage = (e) => console.log("Received:", e.data);ws.send("Hello WebSocket!");
</script>
3. SSE Server (Java Servlet)
@WebServlet("/sse")
public class SseServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {resp.setContentType("text/event-stream");resp.setCharacterEncoding("UTF-8");PrintWriter writer = resp.getWriter();for (int i = 0; i < 5; i++) {writer.write("data: SSE Message " + i + "\n\n");writer.flush();Thread.sleep(1000);}}
}
// 客户端测试
const es = new EventSource("/sse");
es.onmessage = e => console.log(e.data);
关键区别总结
-
通信方向
- HTTP:客户端发起请求
- WebSocket:双向实时通信
- SSE:服务器单向推送
-
连接生命周期
- HTTP:请求后立即关闭(Keep-Alive可复用)
- WebSocket/SSE:持久化长连接
-
协议开销
- WebSocket建立后头部开销最小(2-10字节)
- HTTP每次请求携带完整头部
- SSE基于HTTP,但连接复用减少开销
-
重连机制
- SSE内置自动重连
- WebSocket需手动实现
- HTTP每次请求都是新连接
-
数据格式
- WebSocket支持二进制(适合传输文件)
- SSE仅文本(需Base64编码传输二进制)
技术选型建议
- 需要双向实时交互(如聊天室)→ WebSocket
- 只需服务器推送(如通知系统)→ SSE(更简单)
- 传统请求/响应场景 → HTTP
- 需要兼容旧浏览器 → HTTP长轮询 + SSE降级方案