2012-11-29 71 views
1

我研究過HTML5 EventSource規範,但無法弄清楚如何解析和處理收到數據末尾的回車。解析來自網絡的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'作爲空行標記,並且它不會在一段時間內發送任何其他內容。

回答

1

有趣的問題!我假設你沒有使用瀏覽器,而是編寫自己的客戶端? (如果寫服務器端代碼,總是發送\ n或只是\ r !!)

解決方案是從套接字讀取時,將任何「\ r \ n」序列轉換爲「\ r」。 換句話說,只要你得到「\ r」,你可以把它當作行尾,做任何你需要的處理,並設置一個CR_just_received標誌。如果您收到「\ n」和CR_just_received==true,然後悄悄吞下它。確保接收到除\ r之外的任何字節時,清除CR_just_received