nodejs net.createServer 大量数据传入

Dmy*_*nko 4 actionscript-2 node.js

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

更新

我在这里找到了类似的问题。但没有明确的答案。我知道我的消息的结尾应该是空字节,但是你能给我一个关于如何存储不完整消息并避免与下一条/并发消息重叠的例子吗?

更新2

在 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();
    }
    }
Run Code Online (Sandbox Code Playgroud)

mae*_*ics 5

这是我会做的(经过测试):

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 = '';
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

请注意,多个空分隔消息可能会编码在单个数据块中,因此您应该扩展此示例以将数据用空字符分隔并分别处理每个消息。此外,您可能希望处理有关连接'end'事件的最终可能不完整的消息。