nodejs net.createServer有大量数据进来

时间:2012-01-30 21:00:45

标签: node.js actionscript-2

我有nodejs监听tcp端口并从Flash XMLSocket获取内容。如果我尝试从flash(XMLSocket.send(long_message))中的一条消息中推送大量数据,那么我总是会在事件stream.on("data", function(d) {被触发时发送,而我希望在传输整个消息时发生这种情况。 Flash的XMLSocket将数据传输为以空字节终止的UTF8编码字符串。 如何控制邮件的一致性?

更新

我发现了类似的问题here。但是没有明确的答案。我知道我的消息的结尾应该是空字节,但是请你举个例子来说明如何存储不完整的消息并避免与下一个/并发消息重叠

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 个答案:

答案 0 :(得分:4)

这就是我要做的(测试):

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'事件上处理最终的,可能不完整的消息。