【问题标题】:Why is node.js breaking incoming data into chunks?为什么 node.js 将传入的数据分成块?
【发布时间】:2012-06-28 01:35:45
【问题描述】:

node.js 中的以下代码不会在括号内记录所有传入数据,而是将数据分成块。例如,如果输入数据是 ABCDEF...XYZ,它会将数据记录为 [ABC][DEF]...[XYZ] 而不是 [ABCDEF...XYZ]。当然,数据要大得多,字母表只是一个例子。

我应该如何编写,以便所有传入的数据都记录在括号内而不是部分?

chatServer.on('connection', function(client) 
{
    client.on('data', function(data) 
    {
        console.log('[' + data.toString() + ']');
    })    
})

【问题讨论】:

    标签: events node.js loops


    【解决方案1】:

    您的数据是以数据包的形式到达的,因此(在这种情况下)您应该将数据包连接到您在函数外部定义的变量中。

    buffer = '';
    
    chatServer.on('connection', function(client) 
    {
        client.on('data', function(data) 
        {
            buffer += data.toString();
        })    
    });
    
    console.log('[' + buffer + ']');
    

    【讨论】:

    • 那么块对应到达的TCP数据包?
    • @Zaz 否。这完全取决于 highwaterMark 值,您可以将其传递给流构造函数,在此处阅读更多信息:nodejs.org/api/stream.html#stream_buffering
    • @Zaz:如果client(这是一个双工流)处于流动模式,则添加stream.push(chunk)的数据将与'data'一起传递事件。结果,块的大小对应到达的TCP segment的数据。见这里:nodejs.org/api/stream.html#stream_readable_push_chunk_encoding 但是,如果流暂停然后恢复,它将缓冲到highwaterMark,因此之后释放的块将不对应单个TCP segment 包含的数据。
    【解决方案2】:

    就像 matthewdavidson 所说,您订阅的是发送的每个“块”数据,而不是整个消息。您更有可能希望在函数内的闭包中捕获数据并仍然异步响应。请尝试以下操作:

    chatServer.on('connection', function(client) 
    {
        var buffer = '';
    
        client.on('data', function(data) 
        {
            buffer += data;
        })
    
        client.on('end', function(){
            console.log('[' + buffer + ']');
        })
    });
    

    结帐http://www.nodebeginner.org/#handling-post-requests了解更多信息

    【讨论】:

    • 但是只有在客户端断开连接时才调用 client.on('end', function(){...}) 吗?我正在研究确定缓冲区结尾的原因是我可以使用完整的字符串调用 JSON.parse。
    • 啊现在我找到了你正在使用的模块[nodejs.org/api/net.html]你的客户端是什么样的?完成队列后是否关闭连接?它只是继续发送数据集,而您负责识别每个数据集的开始/结束吗?
    • 第二个。客户端作为输入和输出流,向/从节点发送和接收数据。它们由用户关闭(终止)。
    • 你怎么知道你有一个“完整的字符串”?是否有一些字符标志着“消息”的结束?或者当一段时间内没有更多消息时,是否认为消息已完成(从名称“chatServer”猜测可能是这种情况)?在任何情况下,您都需要缓冲传入的数据,然后决定何时有足够的数据来解析它。
    • 我没有。我检查了net 规范(感谢@vossad01),但我找不到在数据结束时触发的事件。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2021-10-29
    • 2012-05-05
    • 2021-12-29
    • 2015-08-27
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多