2013-02-26 114 views
0

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

回答

0

使用socket.once而不是socket.on,它是另一個類似於.on的EventEmitter,它只是第一次發射一次。檢查docs。但請記住,客戶不會收到任何此類事件。