节点JS:socket.io - 处理多个连接
我在节点JS使用socket.io一个新手 - 但是我已经编写了一个客户端(网页)/服务器程序在客户端呈现的一些统计数据。 的要求是一样 - 呈现一个盒子统计(出许多)。由于用户可以同时打开多个浏览器窗口 - 我们有其中一个箱的数据可以通过多次请求一个场景:节点JS:socket.io - 处理多个连接
http://www.tool.com?boxname=box1
因此我想实现一个产卵工作为同一个盒子多个请求。下面是我已经实现,以达到要求的逻辑:
客户端:
-
建立到服务器创建数据信道的连接:
socket.on(boxname.toLowerCase(),功能(数据){ }
所以每当有在我接收boxname事件的数据,解析该数据并将其呈现。
服务器端
首先调用expect脚本复制一个脚本来一个箱子上的无限循环中运行。
-
在框中的脚本成功复制 - 调用另一个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一次只有每个请求?