2014-04-16 75 views
0

我正在嘗試編寫一個新的分隔的TCP客戶端,它應該能夠接收大尺寸數據。 要接收的傳入數據的特徵是,node.js大尺寸數據的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'); 
}); 

我期待着增強上面的程序。

有時它會轉儲不完整的數據,有時會同時多次換行分隔數據。

回答

0

無法保證您將在「數據」事件處理程序中接收多少數據(除非至少有一個字節)。您必須自己緩衝數據並手動搜索換行符,並在適當的地方進行剪切。事情是這樣的:

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); 
}); 
0

作爲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) 
});