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

Server-Sent Events (SSE) 技术详解

Server-Sent Events (SSE) 技术详解

一、基础概念

1. 核心特点

  • 单向通信:仅服务器→客户端方向
  • 基于HTTP:使用标准HTTP/1.1协议
  • 文本协议:UTF-8编码的纯文本格式
  • 自动重连:内置断线重连机制
  • 轻量级:API设计简洁

2. 协议对比

特性SSEWebSocketPolling
协议HTTPws/wssHTTP
延迟极低
数据方向单向双向半双工
浏览器支持除IE全部全部

二、技术实现细节

1. HTTP 响应头

服务器必须设置以下头部:

Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive

2. 事件流格式

基本结构:

event: messageType\n
data: messageContent\n\n

示例:

event: status
data: {"time": "2023-05-20", "value": 42}data: This is a simple message: comment line (ignored)
id: 12345
retry: 5000

3. 字段说明

  • data: 消息内容(可多行,最终会合并)

  • event: 事件类型(默认message)

  • id: 事件ID(用于断线重连时Last-Event-ID头)

  • retry: 重连延迟(毫秒)

  • :: 注释行(会被客户端忽略)

三、实践

以下是用Python实现SSE(Server-Sent Events)的完整示例,包含服务端和客户端实现:

1、服务端

from flask import Flask, Response, request
import time
import jsonapp = Flask(__name__)@app.route('/stream')
def stream():def event_stream():count = 0while True:time.sleep(1)  # 模拟延迟count += 1# 构建SSE格式数据data = {"time": time.strftime("%Y-%m-%d %H:%M:%S"),"count": count}# SSE格式要求event = f"data: {json.dumps(data)}\n\n"yield eventif count >= 10:  # 限制发送10条后结束yield "event: end\ndata: Stream completed\n\n"breakreturn Response(event_stream(),mimetype="text/event-stream",headers={'Cache-Control': 'no-cache','Connection': 'keep-alive','X-Accel-Buffering': 'no'  # 禁用Nginx缓冲})if __name__ == '__main__':app.run(threaded=True, port=5000)

2、客户端

import requests
import jsonurl = 'http://localhost:5000/stream'def sse_client():with requests.get(url, stream=True) as response:content_type = response.headers.get('content-type', '')if 'text/event-stream' in content_type:buffer = ""for chunk in response.iter_content(chunk_size=1024):if chunk:buffer += chunk.decode('utf-8')while '\n\n' in buffer:event, buffer = buffer.split('\n\n', 1)process_event(event)else:print(f"Server does not support SSE, content-type: {content_type}")def process_event(event):lines = event.split('\n')event_data = {}event_type = 'message'  # 默认事件类型for line in lines:if line.startswith('event:'):event_type = line.split(':', 1)[1].strip()elif line.startswith('data:'):data = line.split(':', 1)[1].strip()try:event_data = json.loads(data)except json.JSONDecodeError:event_data = dataif event_type == 'end':print("Stream ended")else:print(f"Received {event_type}: {event_data}")if __name__ == '__main__':sse_client()

3、关键点说明

服务端要点:
  • 使用生成器(yield)实现持续数据流

  • 响应头必须设置text/event-stream MIME类型

  • 每条消息以data: 开头,以两个换行符\n\n结束

  • 支持自定义事件类型(event: xxx)

客户端要点:
  • 使用stream=True保持长连接

  • 按块(chunk)处理响应数据

  • 正确处理消息边界(检测\n\n)

  • 解析SSE格式的各个字段

http://www.lqws.cn/news/579889.html

相关文章:

  • 【原创】【5】【视频二创工具发布】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道
  • Windows 开发环境部署指南:WSL、Docker Desktop、Podman Desktop 部署顺序与存储路径迁移指南
  • PreparedStatement详解
  • Vue3静态文档资源展示的实现和使用总结
  • 【CS创世SD NAND征文】SD NAND赋能新一代儿童智能玩具
  • js代码04
  • 生信分析之流式数据分析:Flowjo 软件核心功能全解析
  • 《微信生态裂变增长利器:推客小程序架构设计与商业落地》
  • 颠覆传统加密:微算法科技创新LSQb算法,提升量子图像处理速度
  • python | numpy小记(四):理解 NumPy 中的 `np.round`:银行家舍入策略
  • BUUCTF在线评测-练习场-WebCTF习题[MRCTF2020]你传你[特殊字符]呢1-flag获取、解析
  • 攻防世界-MISC-red_green
  • 障碍感知 | 基于3D激光雷达的三维膨胀栅格地图构建(附ROS C++仿真)
  • macos 使用 vllm 启动模型
  • 【数据分析】环境数据降维与聚类分析教程:从PCA到可视化
  • OpenCV CUDA模块设备层----计算向量的平方根函数sqrt
  • 【机器人】复现 HOV-SG 机器人导航 | 分层 开放词汇 | 3D 场景图
  • 极海G32R501双向数字电源解决方案 赋能AI服务器及电源应用创新
  • Android中Compose常用组件以及布局使用方法
  • 深入解析TCP:可靠传输的核心机制与实现逻辑
  • 首次使用“非英伟达”芯片!OpenAI租用谷歌TPU,降低推理计算成本
  • 成像光谱遥感技术中的AI革命:ChatGPT在遥感领域中的应用
  • (LeetCode 每日一题) 594. 最长和谐子序列 (哈希表)
  • redis相关内容以及安全知识
  • 开疆智能CCLinkIE转Canopen网关连接UV紫外灯配置案例
  • python包管理工具uv VS pip
  • iOS 接口频繁请求导致流量激增?抓包分析定位与修复全流程
  • 人工智能和云计算对金融未来的影响
  • 力扣 hot100 Day30
  • 键盘第一下无反应