2

这可能更多地是关于 socket/tcp 行为,而不是 node.js。

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

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

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

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

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

4

2 回答 2

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 套接字(线路)的消息看起来像(其中.......是消息之间的时间)

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

因此,您必须编写代码以在线读取,直到找到开始为止。然后存储有效负载,直到找到分隔符。然后如果分隔符之后的下一个字符不是结束宪章循环并存储下一个有效载荷。

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

于 2012-10-27T15:58:55.130 回答
2

是对这个问题的非常完整的解释,包括解决方案甚至代码。

于 2012-11-08T08:52:10.350 回答