2014-01-06 31 views
0

我正在從Javascript客戶端調用socket.on方法面臨一個奇怪的問題。考慮下面的代碼:socket.on方法的奇怪問題

for(var i=0;i<2;i++) { 
    var socket = io.connect('http://localhost:5000/'); 
    socket.emit('getLoad'); 
    socket.on('cpuUsage',function(data) { 
     document.write(data); 
    }); 
} 

這裏基本上我打電話這是由套接字服務器發出的cpuUsage事件,但每次迭代我收到相同的值。這是輸出:

0.03549148310035006 
0.03549148310035006 
0.03549148310035006 
0.03549148310035006 

編輯:服務器端代碼,基本上我使用節點使用庫來計算CPU使用率:

socket.on('getLoad', function (data) { 

    usage.lookup(pid, function(err, result) { 
     cpuUsage = result.cpu; 
     memUsage = result.memory; 
     console.log("Cpu Usage1: " + cpuUsage); 
     console.log("Cpu Usage2: " + memUsage); 
     /*socket.emit('cpuUsage',result.cpu); 
     socket.emit('memUsage',result.memory);*/ 
     socket.emit('cpuUsage',cpuUsage); 
     socket.emit('memUsage',memUsage); 
    }); 
}); 

凡在服務器端,我得到每個emitsocket.on的值不同。我很奇怪爲什麼會發生這種情況。在每個socket.on調用後,我嘗試設置data = null,但仍然打印相同的值。我不知道要搜索什麼詞組,所以我發佈了。任何人都可以請指導我?

請注意:我基本上是Java開發人員,並且在Javascript方面的經驗較少。

+0

請出示CPU使用率計算的代碼。 – user568109

+0

@ user568109,我加了服務器端代碼 –

回答

1

您正在假設當你使用.emit(),隨後.on()將等待答覆,但是這不是如何socket.io作品。

您的代碼基本上沒有這樣的:

  • 它後直接彼此射兩種getLoad消息(這可能是爲什麼返回值是相同的);
  • 它爲服務器發送的返回cpuUsage消息安裝兩個處理程序;

這也意味着,每次運行循環時,都會爲相同的消息安裝越來越多的處理程序。

現在我不確定你到底想要什麼。如果要定期請求CPU負載,請使用setIntervalsetTimeout。如果你想發送一條消息到服務器並且想要等待響應,你可能需要使用確認功能(沒有很好的文檔記錄,但是參見this blog post)。

但是,您應該假設對於每種消息類型,在代碼運行期間應該只調用socket.on('MESSAGETYPE',)一次。

編輯:這裏是對數據的定期輪詢一個例子客戶端設置:

var socket = io.connect(...); 

socket.on('connect', function() { 
    // Handle the server response: 
    socket.on('cpuUsage', function(data) { 
    document.write(data); 
    }); 

    // Start an interval to query the server for the load every 30 seconds: 
    setInterval(function() { 
    socket.emit('getLoad'); 
    }, 30 * 1000); // milliseconds 
}); 
+0

基本上我想定期請求CPU負載說每30秒。我試圖實現這一點。 –

+0

@PradeepSimha我已經添加了一個關於如何實現該功能的示例 – robertklep

+0

謝謝...... :) –

1

使用此行:

變種插座= io.connect( 'iptoserver',{ '迫使新的連接':真});

用實際的ip替換iptoserver到服務器當然在這種情況下是localhost。

編輯。 也就是說,如果你想創建多個客戶端。

否則,您必須在for循環之前啓動套接字變量。

+0

太棒了!這也製造了詭計。讓我等待幾個更多的答案:)我不知道,每次創建新的連接是一個很好的做法:) –

+0

放置var socket = io.connect(....);在您的客戶端代碼中的for()循環在每次循環「循環」時都不會創建新連接。所以它是你想要達到的目標。 – user3054852

+0

我試過放在for循環之外,但仍然存在相同的問題:( –

1

我懷疑這個調​​用在啓動時會返回平均CPU使用率,這在這裏似乎就是這種情況。檢查節點使用文檔頁面(average-cpu-usage-vs-current-cpu-usage)我發現:

缺省情況下CPU百分比提供了從起始時間 過程的平均值。它不能正確反映當前的CPU使用情況。 (這也是Linux的ps工具有問題)

但如果連續調用usage.lookup()對於一個給定PID,可以 接通keepHistory標誌,你會得到的CPU使用率,因爲上次 你跟蹤使用情況。這反映了當前的CPU使用情況。

還給出瞭如何使用它的例子。

var pid = process.pid; 
var options = { keepHistory: true } 
usage.lookup(pid, options, function(err, result) { 

});