如何在Socket.io中模拟延迟?

时间:2016-03-15 07:25:49

标签: node.js websocket socket.io simulation latency

目前,我正在localhost和连接到路由器的设备上测试我的Node.js,Socket.io服务器。

出于测试目的,我想模拟发送消息的延迟,因此我知道它对全世界的用户来说会是什么样。

有没有有效的方法呢?

2 个答案:

答案 0 :(得分:6)

如果它是您要从服务器发送的要延迟的消息,则可以使用添加短延迟的新连接覆盖每个新连接上的.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秒) )。因此,如果执行发送的代码实际上在从现在开始一秒钟之前修改了该数据,那么这可能会产生问题。这可以通过制作传入数据的副本来修复,但我没有在这里添加复杂性,因为它并不总是需要,因为它取决于调用者代码的工作方式。

答案 1 :(得分:2)

一个陈旧但仍然很受欢迎的问题。 :)

您可以使用" iptables"或" tc"模拟延迟/丢弃数据包。请参阅" iptables"的手册页。并寻找'统计'。我建议您确保指定端口,否则您的ssh会话将受到影响。

以下是" tc"的一些好例子: http://www.linuxfoundation.org/collaborate/workgroups/networking/netem