我在節點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一次只有每個請求?