什么事SSESSEvswebsocket
- 游戏开发
- 2025-08-26 10:48:02

SSE(Server-Sent Events,服务器推送事件) 是一种基于 HTTP 的轻量级协议,允许服务器主动向客户端(如浏览器)推送实时数据。它是 HTML5 标准的一部分,适用于需要服务器单向实时通信的场景(例如新闻推送、股票行情、实时日志等)。
SSE 核心机制 1. 通信模式 单向性:仅支持服务器到客户端的单向通信(客户端无法通过 SSE 向服务器发送数据)。长连接:客户端通过一次 HTTP 请求建立连接,服务器保持连接打开状态,持续发送数据流。 2. 协议特性 基于 HTTP:使用标准 HTTP 协议,无需额外协议支持(如 WebSocket)。文本格式:数据以纯文本形式传输(支持 UTF-8 编码),格式灵活。事件驱动:数据可附带自定义事件名称(如 message、update),客户端可监听特定事件。 3. 数据格式每条消息由以下字段组成(以换行符分隔):
event: <event-name> // 自定义事件名称(可选) data: <message-content> // 消息内容(可多行) id: <message-id> // 消息唯一标识(可选) retry: <reconnect-ms> // 断线重连时间(可选)
示例:
event: status data: {"user": "Alice", "status": "online"}
data: This is a message data: with multiple lines.
id: 123 retry: 5000
SSE 工作原理
客户端建立连接 浏览器通过 EventSource API 向服务器发起请求:
const eventSource = new EventSource("/sse-endpoint");
服务器保持连接 服务器响应 HTTP 头 Content-Type: text/event-stream,并保持连接打开:
HTTP/1.1 200 OK Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive
服务器推送数据 服务器通过流式响应(Streaming Response)持续发送符合 SSE 格式的数据块:
// Spring 中使用 SseEmitter 的示例 @GetMapping("/sse-endpoint") public SseEmitter streamEvents() { SseEmitter emitter = new SseEmitter(); executor.execute(() -> { for (int i = 0; i < 10; i++) { emitter.send(SseEmitter.event() .name("update") .data("Event " + i + " @ " + new Date())); Thread.sleep(1000); } emitter plete(); }); return emitter; }客户端处理数据 客户端监听事件并更新界面:
eventSource.addEventListener("update", (event) => { console.log("Received:", event.data); });SSE 的优缺点 优点缺点简单易用,基于 HTTP,无需复杂协议仅支持单向通信(服务器到客户端)自动重连机制(客户端自动处理断线)部分旧浏览器不支持(IE、早期移动端)天然支持文本数据(如 JSON、日志)默认不支持二进制数据(需编码为文本)轻量级,适合高频低延迟场景长连接可能受代理或防火墙限制
SSE vs. WebSocket vs. 轮询 技术通信方向协议复杂度适用场景SSE单向(服务端→客户端)HTTP低实时通知、数据流(如日志)WebSocket双向WebSocket高聊天、实时协作、游戏轮询(Polling)客户端主动请求HTTP低低频更新(兼容性要求高)
SSE 应用场景 实时通知 用户消息提醒、系统报警。 数据流传输 实时日志、股票行情、新闻推送。 进度反馈 文件上传/下载进度、长时间任务状态更新。 动态内容更新 实时评论、投票结果、在线用户列表。
代码示例(Spring Boot) 服务端(Java) @RestController public class SseController { private final ExecutorService executor = Executors.newCachedThreadPool(); @GetMapping("/stream") public SseEmitter streamData() { SseEmitter emitter = new SseEmitter(); executor.execute(() -> { try { for (int i = 1; i <= 5; i++) { emitter.send(SseEmitter.event() .name("progress") .data("Progress: " + i * 20 + "%")); Thread.sleep(1000); } emitter plete(); } catch (Exception e) { emitter pleteWithError(e); } }); return emitter; } } 客户端(JavaScript) const eventSource = new EventSource('http://localhost:8080/stream'); eventSource.onmessage = (e) => { console.log('Message:', e.data); }; eventSource.addEventListener('progress', (e) => { document.getElementById('progress').innerText = e.data; });
注意事项 跨域问题 需配置 CORS(如 Spring Boot 的 @CrossOrigin)。 连接管理 客户端需手动关闭连接:eventSource.close()。 错误处理 监听 error 事件处理网络中断或服务器错误。 性能优化 控制推送频率,避免服务器资源耗尽。
总结:SSE 是实现服务器到客户端实时单向通信的高效方案,适合需要轻量级、易集成的场景(如通知、数据流)。在 Spring 中可通过 SseEmitter 快速实现,结合前端 EventSource 完成实时交互。
什么事SSESSEvswebsocket由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“什么事SSESSEvswebsocket”