【问题标题】:node.js tcp line receiver implementation for big size data大数据的node.js tcp线路接收器实现
【发布时间】:2014-05-31 14:14:10
【问题描述】:

我正在尝试编写一个新的行分隔的 TCP 客户端,它应该能够接收大尺寸数据。 要接收的传入数据的特征是,

数据以新行分隔。 数据也不断来自某些服务器。 有时数据多条新行将小尺寸和大尺寸数据分开作为突发。但是它们很好地分隔了新行。

我正在尝试为此编写一个 node.js 程序。但它不工作。 我试过了..

var net = require('net');
var client = new net.Socket();
client.connect(1337, '127.0.0.1', function() {
    console.log('Connected');
    client.write('Hello, server! Love, Client.');
});

client.on('data', function(data) {
    console.log('Received: ' + data);
});

client.on('close', function() {
    console.log('Connection closed');
});

我希望改进上述程序。

有时它会同时转储不完整的数据,有时会同时转储多个换行符分隔的数据。

【问题讨论】:

    标签: node.js tcp stream


    【解决方案1】:

    无法保证您将在“数据”事件处理程序中接收到多少数据(除非至少有 1 个字节)。您必须自己缓冲数据并手动搜索换行符并在适当的地方进行剪切。像这样的:

    var buffer = '';
    client.on('data', function(data) {
      var prev = 0, next;
      data = data.toString('utf8'); // assuming utf8 data...
      while ((next = data.indexOf('\n', prev)) > -1) {
        buffer += data.substring(prev, next);
    
        // do something with `buffer` here ...
        console.log('got whole message: ' + buffer);
    
        buffer = '';
        prev = next + 1;
      }
      buffer += data.substring(prev);
    });
    

    【讨论】:

      【解决方案2】:

      由于net.Socket 是可读流,您可以为此使用event-stream module。它包含.split() 函数,确保每一行都是一个块:

      client.pipe(es.split())
      .pipe(es.map(function (data, cb) {
          console.log('Got the following message:', data);
          cb(null)
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-29
        • 2016-05-26
        • 2015-10-14
        • 2014-12-17
        相关资源
        最近更新 更多