NodeJS缓冲区不完整的TCP流数据

时间:2018-02-01 06:44:42

标签: javascript node.js sockets tcp

我正在尝试在我的实时服务器上识别我的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变量清除。

用户声称有一种可能性是通过字节大小捕获数据。不幸的是,我没有这个选项,因为我不知道我的流有多大。

我已经使用;来捕获数据的端点,据我知道该怎么做。

1 个答案:

答案 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
    ....