[英]Testing multiple connections to socket.io server
我想為我的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.
您正面臨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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.