如何判断Server-Sent Event单个事件的结束?应对数据含空行情况
Server-Sent Event(SSE)事件结束的正确判断规则
首先要明确:SSE的事件结束标识不是单个空行,而是两个连续的换行符(\n\n)——这是W3C规范明确规定的事件分隔逻辑。
当data字段包含空行时的处理逻辑
- 服务端侧:
如果要发送的data内容包含换行(包括空行),需要把内容按换行拆分,每一行都加上data:前缀后发送。比如原始data是:
服务端需要输出的格式为:Hello Worlddata:Hello data: data:World - 客户端侧:
接收时,要把同属一个事件的所有data:开头的行收集起来,去掉每行的data:前缀(若data:后直接换行,对应原始内容里的空行),再将这些行拼接,就能还原出带换行的原始data内容。只有当遇到连续两个换行符时,才判定当前事件结束。
结合你的示例修正理解
你之前看到的单个事件后的空行,其实是\n\n中第二个换行的显示效果。真正的事件分隔是连续两个换行,data内部的换行只会被解析为内容的一部分,不会触发事件结束。
比如服务端发送带空行的data事件:
String multiLineData = "Hello\n\nWorld"; emitter.send(SseEmitter.event().id("id").name("eventMultiLine").data(multiLineData));
按照SSE规范,服务端会自动将其转换为:
id:id event:eventMultiLine data:Hello data: data:World
并以\n\n结尾。客户端接收时,会把这三行data:开头的内容拼接,还原出Hello\n\nWorld的原始数据,直到遇到\n\n才判定该事件结束。
内容的提问来源于stack exchange,提问作者KijeviGombooc
相关产品推荐
相关产品推荐

