节点JS:socket.io - 处理多个连接

问题描述:

我在节点JS使用socket.io一个新手 - 但是我已经编写了一个客户端(网页)/服务器程序在客户端呈现的一些统计数据。 的要求是一样 - 呈现一个盒子统计(出许多)。由于用户可以同时打开多个浏览器窗口 - 我们有其中一个箱的数据可以通过多次请求一个场景:节点JS:socket.io - 处理多个连接

http://www.tool.com?boxname=box1

因此我想实现一个产卵工作为同一个盒子多个请求。下面是我已经实现,以达到要求的逻辑:

客户端:

  1. 建立到服务器创建数据信道的连接:

    socket.on(boxname.toLowerCase(),功能(数据){ }

所以每当有在我接收boxname事件的数据,解析该数据并将其呈现。

服务器端

  1. 首先调用expect脚本复制一个脚本来一个箱子上的无限循环中运行。

  2. 在框中的脚本成功复制 - 调用另一个expect脚本,以开始执行:

    exports.ServiceMonitor =函数(boxName,RES){

步骤1.

我需要复制脚本多次请求来其他我不能输入这个催生过程的'退出'事件,我开始脚本执行,如下所述:

var child = spawn('./scripts/copyscriptonbox.sh' , [boxName.toLowerCase(), getURL(boxName)]); 

在我不断添加盒名称boxnames这是声明的全局变量的代码的后面部分。所以在一个新的boxname请求上 - 我搜索boxnames变量中boxname出现次数。如果计数为1个或多个那就意味着,我认为一个脚本已经在该机器上运行:

 var noofbox = boxnames.split(boxName.toLowerCase()).length - 1; 

     child.on('exit', function (code) { 
       logger.info('child stream exit: ' + code); 
       if(code == 0) 
       { 
         boxNames += boxName.toLowerCase(); 
         logger.info('Box name added: ' + boxNames); 
         res.render('boxpage', {}); //render a web page 
         io.sockets.on('connection', function (socket) { 
      logger.info('Connected to box :' + boxName); 
      if(noofbox <= 0)    
          schild = spawn('./scripts/boxmon.sh', [boxName.toLowerCase(), getURL(boxName)]); 
         schild.on('exit', function (code) { 
           logger.info('schild stream exit.'); 
         }); 
         schild.stderr.on('data', function (data) { 
           logger.info('stderr: ' + data); 
         }); 
         schild.stdout.on('data', function (data) { 
           //generate response 
         }); 
         socket.on('disconnect',function(){logger.info('Disconnect Killed');ServiceMonitorEnd(boxName.toLowerCase());}); 
         }); 
       } 
     }); 
} 

的问题是,如果两个浏览器窗口访问I网址:www.tool.com?boxname= BOX1 - 我第一次拿到日志只有一次(连接到箱:BOX1),但我得到相同的日志,第二次2次在那里,因为我是期待它成为一个时间 - 我的意思是尽可能多的请求,第一个后进来日志获取打印许多倍 - 如果5然后Log获取印制1(第一次)2(第二次)3(第3次)4(第四次)5(第五次)?我明白,当'连接'事件被调用了x次时,它会为每个连接进行很多次。 我怎样才能让“连接”事件对socket.io一次只有每个请求?

使用socket.once而不是socket.on,它是另一个类似于.on的EventEmitter,它只是第一次发射一次。检查docs。但请记住,客户不会收到任何此类事件。