当前位置: 首页 > article >正文

HTTP、WebSocket、SSE 对比

特性HTTPWebSocketSSE (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);

关键区别总结

  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降级方案
http://www.lryc.cn/news/2402954.html

相关文章:

  • Linux编程:1、文件编程
  • Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁
  • 【Spark征服之路-2.3-Spark运行架构】
  • PART 6 树莓派小车+QT (TCP控制)
  • 软珊瑚成分 CI-A:靶向口腔癌细胞的 “氧化利剑” 与 ERK 密码
  • Cilium动手实验室: 精通之旅---4.Cilium Gateway API - Lab
  • 【芯片设计- RTL 数字逻辑设计入门 4.2 -- 组合逻辑赋值 + 时序逻辑状态保持】
  • 如何使用索引和条件批量更改Series数据
  • Java转Go日记(六十):gin其他常用知识
  • 89.实现添加收藏的功能的后端实现
  • v1.0.1版本更新·2025年5月22日发布-优雅草星云物联网AI智控系统
  • 如何创造出一种不同于程序语言的人与机器自然交互语言?
  • 宝塔think PHP8 安装使用FFmpeg 视频上传
  • 26.【新型数据架构】-零ETL架构
  • 静态相机中的 CCD和CMOS的区别
  • 【MySQL基础】数据库的备份与还原
  • bug:undefined is not iterable (cannot read property Symbol(Symbol.iterator))
  • 为UE5的Actor添加能够读写姿态的功能
  • 机器学习:支持向量机(SVM)原理解析及垃圾邮件过滤实战
  • LLM Agent 如何颠覆股价预测的传统范式
  • App/uni-app 离线本地存储方案有哪些?最推荐的是哪种方案?
  • 【案例分享】如何借助JS UI组件库DHTMLX Suite构建高效物联网IIoT平台
  • Skia如何绘制几何图形
  • spring:实例化类过程中方法执行顺序。
  • 设置应用程序图标
  • 「基于连续小波变换(CWT)和卷积神经网络(CNN)的心律失常分类算法——ECG信号处理-第十五课」2025年6月6日
  • 用go从零构建写一个RPC(4)--gonet网络框架重构+聚集发包
  • OpenBayes 一周速览|TransPixeler 实现透明化文本到视频生成;统一图像定制框架 DreamO 上线,一键处理多种图像生成任务
  • 视频的分片上传,断点上传
  • CSS 性能优化