测试与socket.io服务器的多个连接

时间:2016-09-12 17:30:18

标签: javascript node.js socket.io

我想为socket.io服务器应用编写一个测试。此测试应创建一些连接(例如10个),然后每个客户端应每2秒向服务器发送一条消息。这是我做的:

var numberOfSockets = 10;
var instruction = "test";

for (var id = 1; id <= numberOfSockets; id++)
{
    var socket = require('socket.io-client')('http://localhost:3000');
    var logPassData = {"login":id, "pass":id, "serverClient":"client"};
    socket.emit('logPass', logPassData);
    newFuncTEST(waitTEST);
}

newFuncTEST(waitTEST);

function waitTEST(){
    setTimeout(function(){
        newFuncTEST(waitTEST);
    }, 2000);
}
function newFuncTEST(callback){
    socket.emit('instruction', instruction);
    callback();
}

日志文件:

23:1:12  9 (Client) logged in.
23:1:12  1 (Client) logged in.
23:1:12  2 (Client) logged in.
23:1:12  9 sent instruction: test.
23:1:12  1 sent instruction: test.
23:1:12  3 (Client) logged in.
23:1:12  2 sent instruction: test.
23:1:12  4 (Client) logged in.
23:1:12  3 sent instruction: test.
23:1:12  5 (Client) logged in.
23:1:12  4 sent instruction: test.
23:1:12  6 (Client) logged in.
23:1:12  5 sent instruction: test.
23:1:12  10 (Client) logged in.
23:1:12  6 sent instruction: test.
23:1:12  7 (Client) logged in.
23:1:12  10 sent instruction: test.
23:1:12  10 sent instruction: test.
23:1:12  8 (Client) logged in.
23:1:12  7 sent instruction: test.
23:1:12  8 sent instruction: test.
23:1:14  10 sent instruction: test.
23:1:14  10 sent instruction: test.
23:1:14  10 sent instruction: test.
23:1:14  10 sent instruction: test.
23:1:14  10 sent instruction: test.
23:1:14  10 sent instruction: test.
23:1:14  10 sent instruction: test.
23:1:14  10 sent instruction: test.
23:1:14  10 sent instruction: test.
23:1:14  10 sent instruction: test.
23:1:14  10 sent instruction: test.

我不知道为什么只有id = 10的客户端会在一段时间后发送指令。所有来自第10个插座的每2秒有11条指令。为什么以及如何将其更改为:

23:1:14  1 sent instruction: test.
23:1:14  2 sent instruction: test.
23:1:14  3 sent instruction: test.
23:1:14  4 sent instruction: test.
23:1:14  5 sent instruction: test.
23:1:14  6 sent instruction: test.
23:1:14  7 sent instruction: test.
23:1:14  8 sent instruction: test.
23:1:14  9 sent instruction: test.
23:1:14  10 sent instruction: test.

1 个答案:

答案 0 :(得分:0)

您正面临javascript中的一个主要范围问题:

for(i=0;i<10;i++){
  var a=i;
  setTimeout(()=>{alert(a);},2000);
}

这将输出:10,10,10 ...... 因为每次循环运行时都会覆盖a。这就是你应该使用let的原因。每次循环运行时它都会创建一个新变量,这可以解决您的问题:

for(i=0;i<10;i++){
  let a=i;
  setTimeout(()=>{alert(a);},2000);
}

在您的代码中:

let socket=...;

创建10个不同的套接字而不是每次覆盖一个... 当然,你必须保持范围。你在调用另一个函数时会丢失它。我建议你缩短你的代码:

for(){
  let socket=...;
  setInterval(()=>{socket.emit()},2000);
}