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

时间:2013-02-26 18:08:13

标签: node.js

我是在Node JS中使用socket.io的新手 - 但是我编写了一个客户端(网页)/服务器程序来在客户端呈现一些统计数据。 要求就像 - 渲染一个框统计(在很多中)。由于用户可以打开多个浏览器窗口 - 我们有一个场景,可以多次请求一个盒子数据:

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

因此我希望为同一个盒子的多个请求实现产生一个作业。以下是我为满足要求而实施的逻辑:

客户端:

  1. 建立与服务器的连接以创建数据通道:

    socket.on(boxname.toLowerCase(),function(data){ }

  2. 因此,每当我收到的boxname事件中有数据时,解析数据并进行渲染。

    服务器端

    1. 首先调用expect脚本来复制脚本,以便在框内的无限循环内运行。

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

      exports.ServiceMonitor = function(boxName,res){

    3. 第1步。

      我需要复制一个脚本多次请求,否则我将无法进入这个生成进程的'exit'事件,我开始执行脚本,如下所述:

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

      在代码的后半部分,我继续向boxnames变量添加框名,该变量被声明为global。所以在一个新的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());});
                              });
                      }
              });
      }
      

      问题是,如果在两个浏览器窗口中我访问URL:www.tool.com?boxname = box1 - 第一次我只获取一次日志(连接到框:box1)但第二次我得到相同的日志2时间,因为我期待它是一次 - 我的意思是,在第一个日志被多次打印之后,有多少请求进入 - 如果5然后日志被打印为1(第一次)+2(第二次)+ 3(第3次)+4(第4次)+5次(第5次)?我理解当'连接'事件被调用x次时,它会为每个连接多次输入。 如何才能在socket.io上为每个请求创建一次“连接”事件?

1 个答案:

答案 0 :(得分:0)

使用socket.once代替socket.on,它是另一个像.on这样的EventEmitter,它只是第一次发出一次。检查docs。但请记住,客户不会收到任何此类事件。

相关问题