sse长连接的关键在于服务端持续输出不关闭响应流并遵循协议格式:设置content-type和cache-control头,每条消息以双换行结尾,定期发送空行或注释防断连,禁用res.end(),配置反向代理超时与缓冲,利用retry控制重连间隔,客户端无需手动保活。

SSE 保持长连接的关键不在客户端“维持”,而在于服务端持续输出、不关闭响应流,并遵循 SSE 协议格式。浏览器的 EventSource 会自动保持 HTTP 连接打开,只要服务端不断写入数据(哪怕只是心跳或空行),连接就不会中断。
服务端必须持续写入响应流
HTTP 连接默认会在响应结束时关闭。SSE 要求服务端把响应体当作一个**永不结束的流**来处理:
- 设置正确的响应头:
Content-Type: text/event-stream和Cache-Control: no-cache - 每次推送数据后,必须以双换行(
\n\n)结尾,这是 SSE 协议规定的分隔符 - 即使没有新数据,也建议每隔 15–30 秒发送一次空行(
\n\n)或注释行(: keep-alive\n\n),防止代理或负载均衡器主动断连 - 不要调用
res.end()或类似终止响应的方法,直到连接明确需要关闭
避免中间件或网关提前关闭连接
很多反向代理(如 Nginx)、CDN 或云函数默认限制响应超时时间(常见为 60 秒),这会导致长连接被意外切断:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- Nginx 中需配置:
proxy_read_timeout 300;(根据业务调整,建议 ≥ 300) - 确保
proxy_buffering off;,避免缓冲阻塞流式输出 - 云平台(如 Vercel、Cloudflare Workers)对长连接支持有限,不推荐用于生产级 SSE;更适合用 Node.js、Express、Fastify 或原生 HTTP server 自托管
利用 retry 控制重连行为,提升连接稳定性
当连接因网络波动断开时,浏览器会自动重试,默认间隔 3 秒。你可以在服务端通过 retry: 字段自定义这个间隔:
- 例如发送:
retry: 5000\n\n,表示断连后等待 5 秒再重连 - 该指令需单独成行,且必须在事件数据前或空行后发送
- 注意:它只影响重试间隔,不影响当前连接是否保持;真正决定“是否长连”的仍是服务端是否持续写入
客户端无需手动保活,但可监听状态辅助诊断
EventSource 本身已内置连接管理逻辑,开发者只需关注业务事件:
-
onopen触发说明连接建立成功 -
onerror触发时,通常意味着连接失败或被服务端关闭;此时不要手动close(),浏览器会按retry值自动重连 - 若需主动断开,调用
eventSource.close()即可,无需额外清理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










