2013-10-27 2 views
0

Вот простой стресс-тест TCP-Server. Пока мы отправляем только одно сообщение на каждого клиента, все работает так, как ожидалось. Но когда отправляются два сообщения на одного клиента, сервер внезапно останавливается без исключения или ошибки. Так это ошибка или функция?Node.js не может обрабатывать несколько сообщений tcp

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

ответ

2

Вы предполагаете, что вызов .write дважды от клиента вызывает data события дважды на сервере, не принимая во внимание любую буферизации, которые могли бы переходите к тому, что будет писать многоугольники.

Когда вызывается обратный вызов .write, это не означает, что оно действительно отправлено, это означает, что сообщение помещается в некоторый буфер ядра (который может содержать более одного сообщения, когда он отправляется на сервер).

+0

И как я могу заверить, что сообщения отправляются? – flosse

+0

ОК, моя ошибка: все работает нормально, я просто забываю определить разделители, чтобы распознать конец/начало сообщения. – flosse

Смежные вопросы