【问题标题】:How can I simulate latency in Socket.io?如何在 Socket.io 中模拟延迟?
【发布时间】:2016-06-30 12:24:45
【问题描述】:

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

出于测试目的,我想模拟发送消息的延迟,这样我就知道对于世界各地的用户会是什么样子。

有什么有效的方法吗?

【问题讨论】:

  • 覆盖 socket.emit() 并通过 setTimeout() 延迟发送每次发送延迟一定的秒数。
  • @jfriend00,是的!请回答! :)

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


【解决方案1】:

一个古老但仍然流行的问题。 :)

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

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

【讨论】:

  • 快速谷歌搜索“TMnetSim 网络模拟器”
【解决方案2】:

如果您想要延迟的是从服务器发送的消息,您可以在每个新连接上覆盖.emit() 方法,并添加一个短暂的延迟。这是在服务器上执行此操作的一种方法:

io.on('connection', function(socket) {
    console.log("socket connected: ", socket.id);
    
    // override the .emit() method
    const emitFn = socket.emit
    socket.emit = (...args) => setTimeout(() => {
        emitFn.apply(socket, args)
    }, 1000) 


    // rest of your connection handler here
 }); 

注意,这里有一个警告。如果您将对象或数组作为socket.emit() 的数据传递,您将看到此代码不会复制该数据,因此在发送数据之前不会实际使用数据(从现在开始 1 秒)。因此,如果执行发送的代码实际上在一秒后发送数据之前修改了该数据,那可能会产生问题。这可以通过制作传入数据的副本来解决,但我没有在这里添加复杂性,因为它并不总是需要,因为它取决于调用者的代码如何工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2017-03-25
    • 2018-04-11
    • 2018-02-25
    • 2021-03-21
    • 1970-01-01
    相关资源
    最近更新 更多