Из того, что я понял здесь , "V8 имеет сборочный сборщик мусора. Случайно перемещает объекты. Узел не может получить указатель на необработанные строковые данные для записи в сокет".поэтому я не должен хранить данные, поступающие из потока TCP, в строку, особенно если эта строка становится больше, чем Math.pow(2,16)
байтов.(надеюсь, я прав до сих пор ..)
Каков наилучший способ обработки всех данных, поступающих из сокета TCP?До сих пор я пытался использовать _:_:_
в качестве разделителя, потому что я думаю, что он как-то уникален и не будет мешать другим вещам.
Примером данных, которые будут получены, будет something_:_:_maybe a large text_:_:_ maybe tons of lines_:_:_more and more data
Вот что я пытался сделать:
net = require('net');
var server = net.createServer(function (socket) {
socket.on('connect',function() {
console.log('someone connected');
buf = new Buffer(Math.pow(2,16)); //new buffer with size 2^16
socket.on('data',function(data) {
if (data.toString().search('_:_:_') === -1) { // If there's no separator in the data that just arrived...
buf.write(data.toString()); // ... write it on the buffer. it's part of another message that will come.
} else { // if there is a separator in the data that arrived
parts = data.toString().split('_:_:_'); // the first part is the end of a previous message, the last part is the start of a message to be completed in the future. Parts between separators are independent messages
if (parts.length == 2) {
msg = buf.toString('utf-8',0,4) + parts[0];
console.log('MSG: '+ msg);
buf = (new Buffer(Math.pow(2,16))).write(parts[1]);
} else {
msg = buf.toString() + parts[0];
for (var i = 1; i <= parts.length -1; i++) {
if (i !== parts.length-1) {
msg = parts[i];
console.log('MSG: '+msg);
} else {
buf.write(parts[i]);
}
}
}
}
});
});
});
server.listen(9999);
Всякий раз, когда я пытаюсь console.log('MSG' + msg)
, он распечатывает весь буфер, поэтому бесполезно видеть, работает ли что-то.
Как мне правильно обрабатывать эти данные?Будет ли работать ленивый модуль, даже если эти данные не ориентированы на строки?Есть ли какой-то другой модуль для обработки потоков, которые не ориентированы на строки?