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)
java 复制代码
@WebServlet("/http")
public class HttpServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws IOException {
        resp.setContentType("text/plain");
        resp.getWriter().write("HTTP Response: " + new Date());
    }
}
bash 复制代码
# 测试命令
curl http://localhost:8080/http
2. WebSocket Server (Jakarta EE)
java 复制代码
@ServerEndpoint("/ws")
public class WebSocketServer {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket connected");
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        try {
            session.getBasicRemote().sendText("Echo: " + message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
html 复制代码
<!-- 客户端测试 -->
<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)
java 复制代码
@WebServlet("/sse")
public class SseServlet extends HttpServlet {
    @Override
    protected 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);
        }
    }
}
javascript 复制代码
// 客户端测试
const es = new EventSource("/sse");
es.onmessage = e => console.log(e.data);

关键区别总结

  1. 通信方向

    • HTTP:客户端发起请求
    • WebSocket:双向实时通信
    • SSE:服务器单向推送
  2. 连接生命周期

    • HTTP:请求后立即关闭(Keep-Alive可复用)
    • WebSocket/SSE:持久化长连接
  3. 协议开销

    • WebSocket建立后头部开销最小(2-10字节)
    • HTTP每次请求携带完整头部
    • SSE基于HTTP,但连接复用减少开销
  4. 重连机制

    • SSE内置自动重连
    • WebSocket需手动实现
    • HTTP每次请求都是新连接
  5. 数据格式

    • WebSocket支持二进制(适合传输文件)
    • SSE仅文本(需Base64编码传输二进制)

技术选型建议

  • 需要双向实时交互 (如聊天室)→ WebSocket
  • 只需服务器推送 (如通知系统)→ SSE(更简单)
  • 传统请求/响应场景 → HTTP
  • 需要兼容旧浏览器 → HTTP长轮询 + SSE降级方案
相关推荐
碳基修炼5 小时前
排查记:本地 devServer 是 http,浏览器却把 302 重定向升级成了 https
前端·http
那年窗外下的雪.13 小时前
第 02 天:Linux 权限、inode、目录项与链接
学习·http
烟雨江南78514 小时前
会议语音识别私有化部署方案:音频不出内网,如何接入现有会议系统
人工智能·websocket·音视频·语音识别·ai客服
那年窗外下的雪.14 小时前
AIDC 学习日志|第 27 天|EVPN 多归属收敛时间线与 Leaf2 接管验证
网络协议·学习·http·tcpdump
j7~14 小时前
【Linux】三十八.C++ 手写 HTTP 服务器:裸 socket + fork 多进程,从 HTTP 报文解析到浏览器打开网页
linux·网络·网络协议·学习·http·网络编程
BreezeJiang2 天前
别把 WebSocket 当成一门新协议学:搞懂"借 HTTP 握手",双端 Demo 和跨域就都通了
websocket·node.js
布莱克6052 天前
HTTP 状态码详解:从分类到实战
计算机网络·http·状态码
StevenSurpass2 天前
打印业务彻底解耦:FastPrintAgent 统一 JSON 模型 + FastReport 引擎的设计与落地
mqtt·http·中间件·打印·fastreport
梦想平凡3 天前
情怀棋牌源代码焕新记录(一):全新国风UI与原版工程梳理
java·服务器·数据库·websocket·网络协议·cocos2d