【问题标题】:Node.js is unable to handle multiple tcp messagesNode.js 无法处理多个 tcp 消息
【发布时间】:2023-03-11 04:55:01
【问题描述】:

这是一个简单的 TCP-Server 压力测试。只要我们每个客户端只发送一条消息,一切都会按预期工作。但是当每个客户端发送两条消息时, 服务器突然停止,没有异常或错误。 那么这是一个错误还是一个功能?

var net = require("net");
var async = require("async");
var cluster = require("cluster");

// `ulimit -n` tells us that we can open max. 1024 files per process.
//  Creating a socket means opening a file so we are limited.
var CLIENTS = 1000;

// Here is the weird part:
// - sending one message per client works fine
// - sending multiple message per client sucks
var MESSAGES = 2;

var TOTAL = CLIENTS * MESSAGES;
var PORT = 1234;
var HOST = "127.0.0.1";

if (cluster.isMaster) {
  var count = 0;
  var start = new Date;

  var server = net.createServer(function(socket) {
    socket.on("data", function(data) {
      var t;
      count++;
      console.log("server received " + count + " messages");
      socket.write(data, function(err) { if (err) console.error(err); });
      if (count === TOTAL) {
        t = (new Date) - start;
        console.log("server received and sent " + count + " messages within " + t + "ms");
      }
    });
  });

  server.listen(PORT, HOST, function() { cluster.fork(); });

} else {

  var run = function(i) {
    var c = net.connect({ port: PORT, host: HOST }, function() {
      var tasks = (function() {
        var results = [];
        for (var x = 1; x <= MESSAGES; ++x) {
          results.push((function(x) {
            return function(next) { c.write("Hello server!", next); };
          })(x));
        }
        return results;
      })();

      async.series(tasks, function(err) {
        if (err) { console.error(err); }
      });

    });
  };
  for (var i = 1; i <= CLIENTS; ++i) { run(i); }
}

在 Linux 3.11、Node.js 0.10.21 上测试

【问题讨论】:

    标签: javascript node.js sockets tcp


    【解决方案1】:

    您假设从客户端调用 .write 两次会在服务器上触发两次 data 事件,而没有考虑可能正在进行的任何缓冲会合并多个写入。

    当调用.write的回调时,并不表示它实际发送的消息,而是表示该消息被放入了某个内核缓冲区(发送到服务器时可能包含多个消息) .

    【讨论】:

    • 我怎样才能保证消息被发送?
    • 好吧,我的错:一切正常,我只是忘记定义分隔符来识别消息的结束/开始。
    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2013-09-26
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多