0

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

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

因此,我想为同一个盒子的多个请求生成一项工作。以下是我为满足要求而实施的逻辑:

客户端:

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

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

因此,每当我收到 boxname 事件中的数据时,解析数据并呈现它。

服务器端

  1. 首先调用一个期望脚本来复制一个脚本以在一个盒子上的无限循环中运行。

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

    export.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());});
                        });
                }
        });
}

问题是,如果在两个浏览器窗口中我访问 URL:www.tool.com?boxname=box1 - 第一次我只获得一次日志(连接到框:box1)但第二次我获得相同的日志 2 次我期待它是一次 - 我的意思是在第一个请求之后进来的许多请求,日志被打印了很多次 - 如果 5 则日志被打印 1(第一次)+2(第二次)+3(第三次时间)+4(第四次)+5(第五次)?我知道当“连接”事件被调用 x 次时,它会为每个连接输入那么多次。如何仅针对每个请求在 socket.io 上进行一次“连接”事件?

4

1 回答 1

0

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

于 2013-02-26T18:26:03.717 回答