2012-10-27 94 views
1

這可能與socket/tcp行爲有關,比node.js更多。通過套接字流式傳輸一系列JSON字符串

我在node.js中寫了一個服務器,它通過套接字(而不是HTTP)接收一系列串聯的JSON對象。

客戶端(iOS應用程序)通過此套接字流式傳輸JSON字符串。每個JSON字符串的大小因時間而異(從幾個字節到幾個K字節)。每個JSON字符串將通過一次「寫入」操作發送。

當我從套接字接收數據時,我調用JSON.parse()。

簡單的測試案例效果很好,但我不確定這是否足夠。 (1)'data'包含多個JSON對象 (2)單個JSON對象通過多個數據發送。

+0

我在問自己同樣的問題!您是否考慮過使用二進制協議而不是JSON,比如Message Pack? – plang

回答

4

你應該爲什麼是json有效負載開發協議,哪些不是。因此,例如通過tcp/ip套接字,您將編寫一個開始字符,然後是json有效內容,結束字符。這樣,您在套接字上的讀取就會知道消息何時開始和結束。現在你想要處理多個json有效載荷的特定情況,你需要一個分隔字符。

所以選擇你的開始,結束和分隔符是由你決定的。有很多字符可以使用。看看一個ASCII /十六進制表的一些選擇。但最好堅持不可打印的字符。否則,你會遇到負載可能包含這些字符的情況。

如果發生這種情況,您需要爲轉義序列開發另一組字符。這意味着一旦你定義了開始,結束和分隔符,這些字符在有效載荷中是非法的,並且必須由發送端的轉義序列替換。這也意味着接收方必須將這些轉義序列轉換回正確的字符,以便有效載荷可以返回到初始狀態。

所以你可以例如定義你的協議爲。

[begin]  = 0x02  // Hex for Start of text 
[end]  = 0x04  // Hex for end of end of transmission 
[separator] = 0x03  // Hex for end of text 

or 

[begin]  = 0x0B  // Hex for Vertical Tab 
[end]  = 0x1C  // Hex for file separator 
[separator] = 0x1E  // Hex for record separator 

那麼你的信息通過TCP/IP套接字(電線)未來會是什麼樣子(其中.......是信息之間的時間)

[begin][json payload][separator][end].......[begin][json payload][seperator][json payload][separator][json payload][separator][end]....... 

,所以你會寫你的代碼在線上讀取直到找到開頭。然後存儲有效負載,直到找到分隔符。然後,如果分隔符後面的下一個字符不是結束包絡循環並存儲下一個有效載荷。

我也建議在谷歌搜索MLLP(最低級別協議)。

+0

謝謝你,約瑟夫。這非常有幫助!我認爲很多人不瞭解這個問題,並且提出了一個部分實現(或者破壞的協議),它在大多數情況下都可行,但不能處理特殊情況。即使XMPP(它發送一個沒有特殊字符的XML有效載荷流)也是半分裂的。 XMPP解析器需要執行try&error解析,直到它接收到每個XML有效負載的末端,如果每個有效負載很大並且分解成塊,這可能非常昂貴。 –

+0

謝謝約瑟夫。你知道一個節點包可以幫助實現嗎?這對我來說看起來很複雜,而且它已經多次被解決了...... – plang

2

Here是非常完整的解決方案,甚至代碼解決這個問題。