目前,我正在localhost
和连接到路由器的设备上测试我的Node.js,Socket.io服务器。
出于测试目的,我想模拟发送消息的延迟,因此我知道它对全世界的用户来说会是什么样。
有没有有效的方法呢?
答案 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