Javascript 在Node.js中为不同的浏览器提供不同的数字变量

Javascript 在Node.js中为不同的浏览器提供不同的数字变量,javascript,html,node.js,Javascript,Html,Node.js,我试图给我的每个客户提供不同的号码。当我在第一个浏览器上单击按钮时,它必须说usernumber是1,当我在第二个浏览器中单击按钮时,我希望它说usernumber是2。它实际上说的是usernumber是2,但只有当我按两次或更多次按钮时才会这么说 在我按下第二个浏览器上的按钮后,我打开第一个浏览器并按下按钮,现在它显示usernumber为2,当我按下两次或更多次时,它显示usernumber为1 所以它一点也不稳定,我总是要按这个按钮来保持它在正确的值 如果你运行我的文件,你会更好地理解我

我试图给我的每个客户提供不同的号码。当我在第一个浏览器上单击按钮时,它必须说
usernumber是1
,当我在第二个浏览器中单击按钮时,我希望它说
usernumber是2
。它实际上说的是
usernumber是2
,但只有当我按两次或更多次按钮时才会这么说

在我按下第二个浏览器上的按钮后,我打开第一个浏览器并按下按钮,现在它显示
usernumber为2
,当我按下两次或更多次时,它显示
usernumber为1

所以它一点也不稳定,我总是要按这个按钮来保持它在正确的值

如果你运行我的文件,你会更好地理解我的意思。我使用google chrome,我的express版本是3.0.0,socket.io版本是0.9.16


以下是我的app.js和index.html文件:

Index.html

客户号
var-ax;
jQuery(函数($){
var socket=io.connect();
emit('getbrowser1',{});
socket.on('getbrowser1f',函数(数据){
ax=数据;
});
var butonene1=document.getElementById(“butonene1”);
butonene1.addEventListener('click',function(){
emit('getbrowser1',{});
document.getElementById(“playerwho”).innerHTML=“usernumber is”+ax;
});
});
丁烯酮1
球员是谁?
App.js
var express=require('express'),
app=express(),
server=require('http')。createServer(应用程序),
io=require('socket.io')。侦听(服务器);
var usernum=0;
var usernum1=[];
应用程序使用(express.static(u dirname+'/');
listen((process.env.PORT | | 5000));
io.sockets.on('connection',函数(socket){
var endpoint=socket.manager.handshaken[socket.id].地址;
console.log(“***来自“+endpoint.address+”:“+endpoint.port”的新连接);
usernumm++;
usernum1[usernum]=endpoint.port;
log('usernum'+usernum+'geldi'+findusernum());
socket.on('disconnect',function()){
usernum--;
log(“***客户端已断开连接”);
});
socket.on('getbrowser1',函数(数据){
var a=findusernum();
io.sockets.emit('getbrowser1f',a);
});
//查找联机用户数
函数findusernum(){
对于(变量i=0;i<4;i++){
if(usernum1[i]==endpoint.port){
返回i;
}else{}
}
}
});

我无法重现您描述的行为,但对于不同的客户端,
endpoint.port
不一定会有所不同。您可能希望改用
uuid

除此之外,代码中还有不同的逻辑问题

当发生连接时,您可以编写:

usernumm++;
usernum1[usernumm] = endpoint.port;
在断开连接时,您有:

usernumm--;
for (var i = 0; i < 4; i++) {
   if (usernum1[i] == endpoint.port) {
     return i;
   } else {}
}
假设您具有以下连接顺序:

UserA connects (usernumm++ => 1)
UserB connects (usernumm++ => 2)

UserA disconnects (usernumm-- => 1)
UserC connects (usernumm++ => 2) << here you overwrite the data of UserB
UserA连接(usernum++=>1)
UserB连接(usernum++=>2)
UserA断开连接(usernumm-->1)

UserC connects(usernum++=>2)您应该编写您正在使用的express、socket.io和浏览器的版本。当我尝试你的代码时,应用程序崩溃,因为
socket.manager
未定义的
。我在我的问题上添加了它们。在你第二次编辑之前,你写过你使用
socket.io
0.9
,但现在你写的是
1.3.7
。在
0.9
socket.manager
中存在,但在
1.3.7
或新版本中它不再存在,因此在
1.3.7
中,您的代码根本不应该运行,因为它将在
socket.manager.handshaken[socket.id].address中引发异常。对不起,我弄错了。它是0.9.16。我肯定。我明白你的意思。但不知何故,我可以从不同的浏览器获得不同的端口。我的实际观点是,点击两次是什么?我没有得到点击两次或两次以上的逻辑。@B.ÖNER我现在能够重现问题,我将检查问题是什么。我的问题是关于app.js和html中运行的代码顺序。我猜它从上到下运行html代码,然后从上到下运行app.js文件代码。我可以通过
setTimeout
索引延迟功能来解决问题。
UserA connects (usernumm++ => 1)
UserB connects (usernumm++ => 2)

UserA disconnects (usernumm-- => 1)
UserC connects (usernumm++ => 2) << here you overwrite the data of UserB
for (var i = 0; i < 4; i++) {
   if (usernum1[i] == endpoint.port) {
     return i;
   } else {}
}