关闭 EventSource 连接需主动调用 close() 方法,使 readyState 变为 0 并停止事件接收;同时监听 error 事件做异常兜底,服务端须响应 socket 关闭信号及时释放资源,并通过状态标记避免自动重连陷阱。

关闭 SSE 的 EventSource 连接,关键在于调用其 close() 方法,并确保客户端和服务器两端都正确响应。
主动调用 close() 方法终止连接
EventSource 实例提供 close() 方法,用于显式断开连接、停止接收事件,并让浏览器释放底层 HTTP 连接。这是释放客户端资源的必要操作。
- 必须在实例上调用,不能只销毁引用(如设为
null)——那样连接仍保持活跃 - 调用后,
readyState立即变为0(EventSource.CLOSED),后续事件不再触发 - 示例:
const es = new EventSource('/stream');<br>es.onmessage = e => console.log(e.data);<br>// ……<br>es.close(); // ✅ 正确关闭
监听 error 事件并合理重试或清理
SSE 连接可能因网络中断、服务重启等意外断开。仅依赖 close() 不够,需结合 error 事件做兜底处理。
- 当
readyState === 0且非主动调用close()时,通常表示异常断开 - 在
error回调中应检查状态,避免重复关闭或无限重连 - 建议:清除定时器、取消未完成请求、重置状态变量,并在必要时手动调用
close()
服务端需识别客户端断连并及时释放资源
浏览器调用 close() 后,TCP 连接会关闭,服务端可通过连接断开信号(如 req.on('close') 或 res.socket.on('close'))感知并清理。
- Node.js(Express/原生 HTTP):监听响应流的
'close'或'end'事件 - 注意:不要仅靠超时或心跳判断——真实断连应优先响应 socket 关闭事件
- 常见疏漏:未移除事件监听器、未关闭数据库游标、未清理内存缓存,导致资源泄漏
避免自动重连陷阱
浏览器默认会在连接断开后自动重试(间隔逐渐增长)。若业务不需要重连,应在初始化时禁用或拦截。
- 无法完全禁用自动重连,但可配合
close()+ 状态标记规避误启 - 推荐做法:设置一个布尔标志(如
isManuallyClosed),在error中判断是否应重连 - 不建议依赖
retry:字段控制——它只影响重连间隔,不阻止重连行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











