Appearance
实验 17 · 全栈流式交付 — SSE 协议、流式分块与增量渲染
本实验突破 HTTP 阻塞响应的体验瓶颈:掌握 Server-Sent Events (SSE) 长连接、字节截断下的行缓冲重建、增量 UTF-8 TextDecoder 防乱码机制,以及前端对 Partial JSON(未闭合 JSON 数据)的高容错即时解析。
网页即时交互实验:SSE 流式分块传输与增量解析演练
在真实的流式 API 传输中,网络数据包可能在任意字节边界(甚至一个中文字符的 3 字节中间)被切片推送。前端若直接对每个 chunk 调用 JSON.parse 或 decode 会立即崩溃或出现乱码。
点击下方交互演示中的流式传输,直观观察在故意制造的极端 8 字节切分下,行缓冲区与 TextDecoder 如何实现零闪烁、零乱码的稳健增量渲染:
交互:流式消费管线(行缓冲 × 增量 decode × partial JSON)
真实端点(可选,POST;留空则跑模拟流)
真实路径用 fetch + ReadableStream + AbortController,不用 EventSource(只支持 GET、无 body、自动重连≠断点续传)。跨域需服务端开 CORS。
状态: 待连接 | 事件: 0 | 心跳: 0 | [DONE]: 否
还没有输出。点「连接」开始模拟流,或填入端点。
流式 decode(正确)
(空)
逐 chunk 非流式 decode(错误示范:乱码对照)
(空)
(空)
网页即时交互演练二:SSE 流式字节分块增量还原
在免安装的浏览器 WebAssembly 运行环境中,直接练习实现网络断包粘包重组与 payload 增量提取:
就绪 (点击运行)
点击右上角「▶ 运行」或按 ⌘/Ctrl+Enter 在浏览器端直接执行交互实验指南
- 模拟断帧与行拼装:观察网络原始 Chunk 到达的过程,体会为什么必须以
\n\n作为 SSE 帧的确定性边界。 - Partial JSON 容错:在模型以流式输出结构化 JSON 字典时,观察解析器如何利用栈匹配自动补全未闭合的括号与引号,实现表单字段的逐个实时点亮。
本地动手实验与单元测试
在网页端观察流式帧演进后,回到本地运行你的全栈 SSE 端点与增量客户端:
bash
cd <仓库根目录>
source .venv/bin/activate
export PYTHONPATH="$PWD/python"
# 运行流式端点与解析器单元测试
pytest python/tests/test_streaming.py -v