eventsource在接收到空行( )时立即结束当前事件块并触发对应事件。空行是sse协议定义的事件分隔符,只要块中含有效字段(如data:或id:),即使data为空也会派发事件;全为注释则忽略该块。

EventSource 在接收到空行(
)时,会将当前事件块视为结束,并立即触发 message 事件(或对应 event 类型的自定义事件),前提是该块中至少包含一个有效字段(如 data: 或 id: 等)。
空行是SSE协议定义的事件分隔符
SSE 协议明确规定:两个连续的换行符(即
或
)标志着一个事件块的终结。EventSource 内部状态机在解析流时,逐行读取并累积字段;一旦遇到空行,就停止收集当前块的字段,进入“提交事件”阶段。
- 空行本身不携带数据,仅作为边界信号
- 即使前面只有
id:或而无 data:,也会触发事件(此时event.data为空字符串) - 若空行前没有任何有效字段(例如全是注释
: comment),则整个块被忽略,不触发任何事件
状态机如何处理字段累积与提交
EventSource 底层维护一个临时事件对象(含 id、event、data、retry 等字段),每解析一行就更新对应字段:
- 遇到
data: xxx→ 追加到当前data缓存(保留换行符,多个data:行会用拼接) - 遇到
id: yyy→ 覆盖当前id值 - 遇到空行 → 结束当前块,若
data非空或有其他有效字段,则构造MessageEvent并派发;随后重置临时对象,开始新块
注意换行符格式和缓冲边界的影响
实际传输中,换行可能是
(Unix)、
(HTTP/1.1 常见)或混合形式。EventSource 实现会标准化处理:
- 自动识别
和为行终止符 - 若数据分片恰好在
处截断(如网络缓冲不完整),状态机会暂存未闭合的行,等待后续字节补全后再判断是否为空行 - 因此,空行触发完结不是简单字符串匹配,而是基于行解析完成后的状态跃迁
开发者可观测的行为表现
你无法直接访问 EventSource 的内部状态机,但可通过以下现象确认空行已触发完结:
-
onmessage或addEventListener('message', ...)立即执行 -
event.lastEventId被更新为该块中id:的值(若存在) - 后续数据从新事件块开始解析,不受前一块影响
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











