Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js无法处理多条tcp消息_Javascript_Node.js_Sockets_Tcp - Fatal编程技术网

Javascript Node.js无法处理多条tcp消息

Javascript Node.js无法处理多条tcp消息,javascript,node.js,sockets,tcp,Javascript,Node.js,Sockets,Tcp,下面是一个简单的TCP服务器压力测试。只要我们每个客户端只发送一条消息,一切都会按预期工作。但当每个客户端发送两条消息时, 服务器突然停止,没有异常或错误。 那么这是一个bug还是一个特性 var net = require("net"); var async = require("async"); var cluster = require("cluster"); // `ulimit -n` tells us that we can open max. 1024 files per pro

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

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); }
}
var net=require(“net”);
var async=require(“异步”);
var集群=需要(“集群”);
//'ulimit-n'告诉我们每个进程最多可以打开1024个文件。
//创建套接字意味着打开一个文件,因此我们受到限制。
var=1000;
//这里是奇怪的部分:
//-每个客户端发送一条消息可以正常工作
//-每个客户端发送多条消息很糟糕
var消息=2;
var TOTAL=客户端*消息;
var端口=1234;
var HOST=“127.0.0.1”;
if(cluster.isMaster){
var计数=0;
var开始=新日期;
var server=net.createServer(函数(套接字){
socket.on(“数据”),函数(数据){
变量t;
计数++;
log(“服务器收到”+count+“消息”);
socket.write(数据,函数(err){if(err)console.error(err);});
如果(计数==总数){
t=(新日期)-开始;
console.log(“服务器在“+t+”毫秒内接收和发送“+count+”消息”);
}
});
});
侦听(端口、主机、函数(){cluster.fork();});
}否则{
var run=函数(i){
var c=net.connect({port:port,host:host},function()){
var tasks=(函数(){
var结果=[];

对于(var x=1;x您假设从客户端调用
.write
两次会触发服务器上的
数据事件两次,而不考虑可能会合并多个写入的任何缓冲


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

我如何确保消息被发送?好吧,我的错:一切正常,我只是忘记定义分隔符来识别消息的结束/开始。