nodejs net.createServer большое количество данных, поступающих в - PullRequest
4 голосов
/ 31 января 2012

У меня nodejs, прослушивающий порт tcp и получающий содержимое из Flash XMLSocket. Если я пытаюсь отправить много данных в одном сообщении из флэш-памяти (XMLSocket.send(long_message)), я всегда получаю событие stream.on("data", function(d) {, которое запускается при передаче всего сообщения. XMLSocket Flash передает данные в виде строки в кодировке UTF8, заканчивающейся нулевым байтом. Как я могу контролировать согласованность своих сообщений?

UPDATE

Я нашел похожий вопрос здесь . Но нет четкого ответа. Я знаю, что конец моего сообщения должен быть нулевым байтом, но не могли бы вы дать мне пример того, как сохранить неполное сообщение и избежать наложения на следующее / одновременное сообщение

UPDATE2

После ответа maerics я сделал что-то вроде

    var server = net.createServer(function(stream) {
    var dataBlock = "";
    stream.on("data", function(d) {
            processChunk(d);
    });

    function processChunk(data) {
            var chunks = data.split("\0");
            while (chunks.length > 1) {
                    if (dataBlock.length > 0) {
                            dataBlock += chunks.shift();
                            processIncompingMessage(dataBlock);
                            dataBlock = "";
                    }
                    else {
                            processIncompingMessage(chunks.shift());
                    }
            }
            dataBlock += chunks.shift();
    }
    }

1 Ответ

4 голосов
/ 31 января 2012

Вот что я бы сделал (протестировано):

var net = require('net');

var server = net.createServer(function (conn) {
  var msg = ''; // Current message, per connection.

  conn.setEncoding('utf8');

  conn.on('message', function (m) {
    console.log('MESSAGE: ' + m);
  });

  conn.on('data', function (data) {
    msg += data.toString('utf8');

    if (msg.charCodeAt(msg.length - 1) == 0) {
      conn.emit('message', msg.substring(0, msg.length - 1));
      msg = '';
    }
  });
});

Обратите внимание, что вполне возможно, что несколько разделенных нулями сообщений могут быть закодированы в один блок данных, поэтому вы должны расширить этот пример для разделения данных.нулевыми символами и обрабатывать каждый отдельно.Также вы можете захотеть обработать окончательное, потенциально неполное сообщение о событии подключения 'end'.

...