问题是通过网络套接字发送大型序列化JSON(超过16,000个字符)会被拆分为块。每个块都会在接收端触发data
事件。因此,只需在传入数据上运行JSON.parse()
,即可SyntaxError: Unexpected end of input
。
到目前为止,我设法提出的工作是在序列化JSON的末尾附加一个空字符('\u0000'
),并在接收端检查它。这是一个例子:
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在发送时被拆分成块的情况呢?
答案 0 :(得分:4)
您可以追加一个不太可能在JSON中的边界字符串。你的\ u0000 - 是的,它似乎是一种合法的方式。但最受欢迎的选择是换行。
您可以使用像dnode这样的外部库,它们应该已经做过我之前提到过的事情。我建议尝试一下。真。
此模型的一个失败是接收器连接到多个套接字,并且每个套接字都在发送大型JSON文件。
为每个套接字使用不同的缓冲区。这里没问题。
答案 1 :(得分: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;
});
});
每次您都可以检查是否收到了“密钥”分隔符,该分隔符将告诉您缓冲区已准备好使用。