我想为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.
答案 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);
}