我正在尝试编写一个新的行分隔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');
});
我希望加强上述计划。
有时它转储不完整的数据,有时同时转储多个新行分隔的数据。
不能保证您将在"data"事件处理程序中接收到多少数据(除非至少有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);
});
由于net.Socket
是可读流,因此可以使用event-stream
模块。它包含.split()
函数,确保每一行都是一个块:
client.pipe(es.split())
.pipe(es.map(function (data, cb) {
console.log('Got the following message:', data);
cb(null)
});