2016-03-15 57 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秒)才会实际使用数据。因此,如果执行发送的代码实际上在从现在开始发送一秒之前修改了这些数据,那么这可能会产生问题。这可以通过制作传入数据的副本来解决,但我并没有在这里增加复杂性,因为它并不总是需要的,因为它取决于调用者的代码是如何工作的。