SSE连接监控依赖HTTP状态码与readyState配合:200时readyState=1(OPEN)表示连接成功;4xx/5xx或非2xx/3xx响应时readyState=0(CONNECTING/CLOSED),触发error但不重试;主动心跳+轮询readyState可提升异常识别可靠性。

SSE(Server-Sent Events)连接的生命周期监控,核心靠两方面:服务端返回的 HTTP 状态码 和客户端 EventSource 实例的 readyState 属性。二者配合使用,才能准确判断连接是否建立、中断、重连或失败。
HTTP 状态码决定连接能否开始
浏览器发起 SSE 请求时(即 new EventSource(url)),会先发送一次 HTTP GET 请求。此时服务端响应的状态码直接决定连接是否进入“可监听”阶段:
-
200 OK:连接成功建立,
readyState变为1(OPEN),后续可接收事件; - 3xx 重定向:浏览器自动跟随(最多 20 次),最终仍需返回 200 才算成功;
-
4xx / 5xx:连接立即失败,
readyState保持0(CLOSED),触发error事件,但不会自动重试; -
非 2xx/3xx 响应(如 401、403、500):
EventSource不会抛异常,而是静默触发error,readyState仍为0。
readyState 反映连接实时状态
readyState 是只读属性,取值为数字(也可用常量:EventSource.CONNECTING = 0、EventSource.OPEN = 1、EventSource.CLOSED = 0)。注意:CLOSED 和 CONNECTING 值相同,需结合上下文区分:
- 0(CONNECTING):初始状态,或连接断开后正在重连(默认 3 秒后重试);
-
1(OPEN):已建立流式连接,正在接收数据(
message、自定义事件触发); -
0(CLOSED):调用了
eventSource.close(),不再重连,readyState固定为 0。
建议在 error 回调中检查 eventSource.readyState:若为 0 且未手动关闭,大概率是网络中断或服务端异常断连。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
主动识别连接异常与重连行为
仅依赖 error 事件不够可靠(例如服务端静默断连可能不触发 error)。更稳妥的方式是结合心跳和 readyState 轮询:
- 服务端定期发送
:\n\n注释行或event: heartbeat\ndata: ...\n\n保持连接活跃; - 前端设置定时器,每 10–15 秒检查
eventSource.readyState !== 1,若为 0 则记录异常并考虑手动重建实例; - 重连时注意避免重复监听:关闭旧实例再新建,或用标志位防止
error多次触发重建。
常见状态组合与应对建议
实际开发中可按以下逻辑处理关键状态:
-
new EventSource 后 readyState === 0,且无 error 触发:可能是服务端未响应(超时)、CORS 阻止、或 MIME 类型错误(必须返回
text/event-stream); - readyState 从 1 突变为 0,且触发 error:服务端关闭连接、网络闪断、代理中断流;
-
readyState 长期为 0,反复 error:检查服务端是否返回了正确状态码和头信息(
Content-Type: text/event-stream、Cache-Control: no-cache、Connection: keep-alive); -
readyState 为 1,但长时间无 data 事件:确认服务端是否真正发送了合法的 event stream 格式(
data: ...\n\n或event: ...\ndata: ...\n\n)。
不复杂但容易忽略。

















