2012-10-27 92 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是非常完整的解决方案,甚至代码解决这个问题。