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

标签 node.js websocket socket.io simulation latency

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

出于测试目的,我想模拟发送消息的延迟,以便我知道世界各地的用户会遇到什么情况。

有什么有效的方法吗?

最佳答案

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

关于node.js - 如何在 Socket.io 中模拟延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36004917/

相关文章:

javascript - 将过滤后的文档从 Mongo 集合传输到另一个集合的最佳方法(在 Nodejs 中)

node.js - 如何在nodejs中从import转换为require

javascript - Node : Get image from PDF whose URL has weird query string

node.js - npm ws (websocket) 一段时间后自动关闭

javascript - 我将如何通过 Javascript 中的 WebSocket 发送和接收数据包

javascript - 在不同的子域上使用 Socket.IO 服务器和客户端

javascript - Nodejs - 简单的 socket.io 示例不会将数据推送到所有浏览器

javascript - 如何将对象数组传递给nodejs并将数组发送到mongo中的文档

javascript - 如果在 Chrome 上运行,createObjectURL 不起作用

javascript - Nodejs 在发布/订阅中从客户端发布