1

我研究了 HTML5 EventSource 规范,但不知道如何在接收到的数据结束时解析和处理回车。

应用程序接收由行组成的数据流。每行可以由 \r\n、\n 或 \r 终止。在空白行上,事件应被视为已准备好并已向侦听器触发。

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 确实是空行标记,则在下一批数据到达并且解析器有足够的数据尝试最长匹配之前,不会触发该事件。

当前数据批次

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' 作为空行标记,暂时不会发送任何其他内容。

4

1 回答 1

1

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

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

于 2013-10-08T09:43:06.383 回答