3

问题是通过网络套接字发送大型序列化 JSON(超过 16,000 个字符)会被分成块。每个块都会data在接收端触发事件。因此,简单地JSON.parse()在传入数据上运行可能会失败SyntaxError: Unexpected end of input

到目前为止,我设法提出的解决方法是将一个空字符 ( '\u0000') 附加到序列化 JSON 的末尾,并在接收端检查它。这是一个例子:

var partialData = '';
client.on( 'data', function( data ) {
    data = data.toString();
    if ( data.charCodeAt( data.length - 1 ) !== 0 ) {
        partialData += data;
        // if data is incomplete then no need to proceed
        return;
    } else {
        // append all but the null character to the existing partial data
        partialData += data.substr( 0, data.length - 1 );
    }
    // pass parsed data to some function for processing
    workWithData( JSON.parse( partialData ));
    // reset partialData for next data transfer
    partialData = '';
});

该模型的失败之一是接收器连接到多个套接字,并且每个套接字都在发送大型 JSON 文件。

我这样做的原因是因为我需要在同一个盒子上运行的两个进程之间传递数据,而且我不喜欢使用端口。因此使用网络套接字。所以会有两个问题:首先,有没有更好的方法在两个 Node.js 进程之间快速传递大量 JSON 数据?其次,如果这是最好的方法,那么我怎样才能更好地处理序列化的 JSON 在发送时被分成块的情况?

4

2 回答 2

4
  1. 您可以每次都使用 try...catch 来查看它是否是有效的 json。虽然不是很好的表现。
  2. 您可以在发送端计算 json 的大小并在 JSON 之前发送它。
  3. 您可以附加一个不太可能在 JSON 中的边界字符串。您的 \u0000 - 是的,这似乎是一种合法的方式。但最受欢迎的选择是换行符。

  4. 您可以使用像 dnode 这样的外部库,它应该已经做了我之前提到的事情。我建议尝试一下。真的。

该模型的失败之一是接收器连接到多个套接字,并且每个套接字都在发送大型 JSON 文件。

为每个套接字使用不同的缓冲区。这里没问题。

于 2012-05-09T05:56:12.723 回答
1

可以单独识别每个套接字并为每个套接字构建缓冲区。当我收到连接时,我向每个套接字添加一个 id,然后当我收到数据时,我将该数据添加到缓冲区。

net.createServer( function(socket) {
  // There are many ways to assign an id, this is just an example.
  socket.id = Math.random() * 1000;
  socket.on('data', function(data) {
    // 'this' refers to the socket calling this callback.
    buffers[this.id] += data;
  });
});

每次您都可以检查是否收到了“密钥”分隔符,它会告诉您缓冲区已准备好使用。

于 2013-11-11T22:59:26.053 回答