从网络中解析HTML5 EventSource流

时间:2012-11-29 01:35:52

标签: html5 parsing server-sent-events

我研究过HTML5 EventSource规范,但无法弄清楚如何在收到的数据结束时解析和处理回车。

App接收由行组成的数据流。每行可以通过\ r \ n,\ n或\ r \ n终止。在空白行中,事件应该被认为是准备好的并且向听众开放。

data: foobar\r\n
id: 1\r\n
\r\n

具有相同内容的同等有效事件

data: foobar\n
id: 1\r\n
\r

完整规范,http://dev.w3.org/html5/eventsource/第6章描述了输入的BNF。

问题是在收到的数据结束时看到的回车。现在,据我所知,正确的解析方法是进行最长匹​​配搜索,然后等待下一批数据。问题是,如果\ r \ n真的是空行标记,则事件不会被触发,直到下一个数据批次到达并且解析器有足够的数据来尝试最长匹配。

当前数据批次

data: foobar\r\n
id: 1\r\n
\r

下一批数据

\n
data: foobar2\r\n
id: 1\r\n
\r\n

替代案例。下一批数据

data: foobar2\r\n
id: 1\r\n
\r\n

这在传统解析中不会出现问题,但它在EventSource中,因为我需要尽快触发事件,因此如果实现等待下一个数据批次获得最长匹配,则如果使用发件人,它可能会等待很长时间单个字符'\ r'作为空行标记,它暂时不会发送任何其他内容。

1 个答案:

答案 0 :(得分:1)

有趣的问题!我假设您没有使用浏览器而是编写自己的客户端? (如果编写服务器端代码,请始终只发送\ n或只发送\ r !!)

解决方案是从套接字读取时,将任何“\ r \ n”序列转换为“\ r”。 换句话说,只要你得到“\ r \ n”,就可以将其视为行尾,执行您需要的任何处理,并设置CR_just_received标志。如果你收到一个“\ n”和CR_just_received==true然后悄悄地吞下它。除非收到除\ r之外的任何字节,否则请确保CR_just_received被清除。