eventsource会自动按换行符解析sse数据,将多行data:拼接为单个字符串,仅取首次出现的id:/event:/retry:值,空行标识事件结束,无需手动处理。

EventSource 对接收到的 SSE 数据会自动按行拆解,不需要手动处理多行拼装的数据。它严格遵循 SSE 协议规范,底层基于换行符(\n 或 \r\n)进行分割,并逐行解析字段(如 data:、event:、id:、retry:)。
EventSource 如何识别和拆分行
EventSource 内部监听响应流,将接收到的字节流按以下规则切分:
- 以
\n或\r\n为行边界,不依赖内容是否“完整”,只要遇到换行就切一行 - 空行(连续换行符之间无内容)表示一个事件结束,触发
message或对应event类型的事件 - 同一逻辑事件的多行
data:会被合并(例如两个data: hello\ndata: world\n\n合并为"hello\nworld")
data 多行拼装的自动合并机制
当服务端发送如下内容时:
data: first line<br>data: second line<br>data: third line<br><br>
EventSource 会把这三行 data: 的值用 \n 连接,最终触发的 event.data 是:
"first line\nsecond line\nthird line"
注意:每行 data: 后面的空格会被自动忽略,冒号后首个非空格字符开始计入内容。
id、event、retry 字段的单行语义
这些字段只取**每行首次出现**的值,且仅在空行前的最后一行生效:
-
id:用于更新内部 last-event-id,后续断连重连会带上 -
event:决定触发哪个事件处理器(如addEventListener('myevent', ...)) -
retry:设置重连间隔(毫秒),只在没有event:或data:的纯配置行中生效
重复字段不会叠加,后出现的覆盖前一个。
乱序或粘包不影响解析逻辑
即使 TCP 层发生粘包(如一次收到两行甚至跨事件的多行),EventSource 仍能正确累积缓冲、按行切分、按空行划分事件边界。它内部维护一个解析状态机,不依赖 chunk 边界,只关心换行位置和字段语法。
你无需做任何额外的字符串 split 或 buffer 管理 —— 这是 EventSource 原生保障的能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











