我正在尝试在我的实时服务器上识别我的TCP JSON流的问题。我发现如果通过TCP(JSON格式)流式传输给我的数据太大,那么它就不会经常进行解析。我必须流几次才能获得成功。
我使用的代码如下:
socket.once('data', function(data){
let chunk = "";
chunk += data.toString(); // Add string on the end of the variable 'chunk'
let d_index = chunk.indexOf(';'); // Find the delimiter
// While loop to keep going until no delimiter can be found
while (d_index > -1) {
try {
let string = chunk.substring(0,d_index); // Create string up until the delimiter
let json = JSON.parse(string); // Parse the current string
pages.addJSON(string);
console.log(json.pagename); // Function that does something with the current chunk of valid json.
}
catch(e){
console.log(e);
}
chunk = chunk.substring(d_index+1); // Cuts off the processed chunk
d_index = chunk.indexOf(';'); // Find the new delimiter
}
});
我的数据作为JSON文件流式传输给我,其中;
用于分隔每个流。例如,{"page": "something"};
我正在使用来自this question的代码,其中一个回复警告我们应该缓冲任何代码不完整的代码。我想知道如何这样做,因为我相信我的问题可能源于这个问题。
由于我的JSON流有点大,我认为很多数据在连接时没有通过,然后由我的chunk
变量清除。
用户声称有一种可能性是通过字节大小捕获数据。不幸的是,我没有这个选项,因为我不知道我的流有多大。
我已经使用;
来捕获数据的端点,据我知道该怎么做。
答案 0 :(得分:2)
socket.once('data', ...)
, .once()
会给您带来问题。如果您在第一次data
事件中未获得所有数据,则您将永远不会看到其余的数据。根本没有关于给定数据事件的数据量的保证。它可以根据一系列因素而变化。在某个地方的慢速链接或代理链接上,您可能会在多个数据事件中获得较小的数据,如果数据很大,您可能几乎可以保证获得多个数据事件,因为它会填满缓冲区某处。
您需要使用socket.on('data', ...)
,这样您才能看到此交易中的所有data
个事件,然后,如果您希望在完成后删除事件处理程序,则可以将其删除当你读完所有内容并完成后。
另请注意,您从that other question借来的代码使用的是socket.on()
,而不是socket.once()
。
您还需要在事件处理程序之外移动chunk
变量的定义,以便它从一个事件幸存到下一个事件。
let chunk = "";
socket.once('data', function(data){
chunk += data.toString(); // Add string on the end of the variable 'chunk'
let d_index = chunk.indexOf(';'); // Find the delimiter
....