2016-03-15 56 views
0

目前,我正在測試我的Node.js,Socket.io服務器localhost以及連接到我的路由器的設備上。如何模擬Socket.io中的延遲?

爲了測試目的,我想模擬發送郵件的延遲,所以我知道全世界的用戶會是什麼樣子。

有沒有這樣做的有效方法?

+0

重寫'socket.emit()',並通過在'setTimeout()'延遲上發送它來將每次發送延遲一定的秒數。 – jfriend00

+0

@ jfriend00,是的!請回答! :) –

回答

0

一個古老但仍然受歡迎的問題。 :)

您可以使用「iptables」或「tc」來模擬延遲/丟棄的數據包。查看「iptables」的手冊頁並查找「統計信息」。我建議你確保指定端口或你的SSH會話會受到影響。

這裏有「TC」一些很好的例子: http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

+0

我使用Windows 7 ... –

+0

快速谷歌提出了「TMnetSim網絡模擬器」 – FrankG

4

如果這是你要延遲服務器發送的郵件,你可以重寫.emit()方法有一個增加了每一個新的連接上短暫的延遲。以下是在服務器上執行此操作的一種方法:

io.on('connection', function(socket) { 
    console.log("socket connected: ", socket.id); 

    // override the .emit() method 
    (function() { 
     var oldEmit = socket.emit; 
     socket.emit = function() { 
      var args = Array.from(arguments); 
      setTimeout(() => { 
       oldEmit.apply(this, args); 
      }, 1000); 
     }; 
    })(); 


    // rest of your connection handler here 
}); 

請注意,這裏有一個警告。如果您傳遞一個對象或數組作爲socket.emit()的數據,您將看到此代碼不會複製該數據,因此在數據發送之前(從現在開始1秒)纔會實際使用數據。因此,如果執行發送的代碼實際上在從現在開始發送一秒之前修改了這些數據,那麼這可能會產生問題。這可以通過製作傳入數據的副本來解決,但我並沒有在這裏增加複雜性,因爲它並不總是需要的,因爲它取決於調用者的代碼是如何工作的。