我研究过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'作为空行标记,它暂时不会发送任何其他内容。
答案 0 :(得分:1)
有趣的问题!我假设您没有使用浏览器而是编写自己的客户端? (如果编写服务器端代码,请始终只发送\ n或只发送\ r !!)
解决方案是从套接字读取时,将任何“\ r \ n”序列转换为“\ r”。
换句话说,只要你得到“\ r \ n”,就可以将其视为行尾,执行您需要的任何处理,并设置CR_just_received
标志。如果你收到一个“\ n”和CR_just_received==true
然后悄悄地吞下它。除非收到除\ r之外的任何字节,否则请确保CR_just_received
被清除。