NodeJS: Как правильно обрабатывать потоки сокетов TCP? Какой разделитель мне следует использовать?

Насколько я понял здесь , «V8 имеет сборщик мусора поколений. Перемещает объекты случайным образом. Узел не может получить указатель на необработанные строковые данные. для записи в сокет ". поэтому мне не следует хранить данные, поступающие из потока TCP, в строке, особенно если эта строка становится больше Math.pow (2,16) байтов. (надеюсь, что я прав…)

Каков наилучший способ обрабатывать все данные, поступающие из сокета TCP? До сих пор я пытался использовать _: _: _ в качестве разделителя, потому что я думаю, что он каким-то образом уникален и не будет мешать другим вещам.

Образец данных, которые будут получены, мог бы быть чем-то _: _: _ может быть большим текстом _: _: _ может быть тонны строк _: _: _ все больше и больше данных

Это то, что я пытался сделать:

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

Каждый раз, когда я пытаюсь консоль. log ('MSG' + msg) , он распечатает весь буфер, так что бесполезно проверять, работает ли что-то.

Как я могу правильно обрабатывать эти данные? Будет ли работать ленивый модуль, даже если эти данные не ориентированы на строки? Есть ли какой-нибудь другой модуль для обработки потоков, которые не ориентированы на линию?

6
задан João Pinto Jerónimo 12 August 2011 в 00:39
поделиться