通过Socket传输一系列JSON字符串

时间:2012-10-27 14:54:38

标签: json node.js sockets networking tcp

这可能比node.js更多地关于socket / tcp行为。

我在node.js中编写一个服务器,它通过套接字(而不是HTTP)接收一系列字符串连接的JSON对象。

客户端(iOS应用)通过此套接字传输JSON字符串。每个JSON字符串的大小各不相同(从几个字节到几个K字节),因此时间也是如此。每个JSON字符串将通过单个“写入”操作发送。

当我从套接字接收数据时,我调用JSON.parse()。

简单的测试用例效果很好,但我不确定这是否足够。

我想知道是否需要担心以下情况, (1)'data'包含多个JSON对象 (2)通过多个数据发送单个JSON对象。

2 个答案:

答案 0 :(得分:4)

您应该为什么是json有效负载开发协议,哪些不是。因此,例如在tcp / ip套接字上,您将编写一个开始字符,然后是json有效负载,结束字符。这样,您对套接字的读取就会知道消息的开始和结束时间。现在你想要处理多个json有效负载的特殊情况,你需要一个分隔符。

因此,选择开始,结束和分隔符字符取决于您。您可以使用许多字符。有些选择请查看ascii / Hex表。但最好坚持使用不可打印的字符。否则,您会遇到有效负载可能包含这些字符的情况。

如果发生这种情况,您将需要为转义序列开发另一组字符。这意味着一旦定义了开始,结束和分隔符,这些字符在有效负载中是非法的,并且必须由发送方的转义序列替换。这也意味着接收方必须将这些转义序列转换回正确的字符,以便有效载荷可以返回到初始状态。

因此您可以将协议定义为。

[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 socket(wire)看起来像(其中.......是消息之间的时间)

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

因此,您必须编写代码才能在线上阅读,直到找到开头。然后存储有效负载,直到找到分隔符。然后,如果分隔符后面的下一个字符不是结束包机循环并存储下一个有效负载。

我还建议在谷歌搜索MLLP(最低级别协议)。

答案 1 :(得分:2)

Here是解决方案甚至代码的完整解释。