在 Node.js 中为不同的浏览器提供不同的数字变量
Giving different number variables to different browsers in Node.js
我正在尝试为每个客户提供不同的数字。当我单击第一个浏览器上的按钮时,它必须说usernumber is 1
,当我在第二个浏览器中执行此操作时,我希望它说usernumber is 2
。它实际上说usernumber is 2
但只有当我按下按钮两次或更多时。
在第二个浏览器上按下按钮后,我打开第一个浏览器并按下按钮,现在它说usernumber is 2
,当我按下两次或更多次时,它说usernumber is 1
。
所以它根本不稳定,我总是必须按下这个按钮才能保持正确的值。
如果你运行我的文件,你会更好地理解我的意思。我使用谷歌浏览器,我的快速版本是 3.0.0,我的 socket.io 版本是 0.9.16。
这是我的应用程序.js和索引.html文件:
索引.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title> client number </title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
var ax;
jQuery(function($) {
var socket = io.connect();
socket.emit('getbrowser1', {});
socket.on('getbrowser1f', function(data) {
ax = data;
});
var butondene1 = document.getElementById("butondene1");
butondene1.addEventListener('click', function() {
socket.emit('getbrowser1', {});
document.getElementById("playerwho").innerHTML = "usernumber is " + ax;
});
});
</script>
</head>
<body>
<button id="butondene1">butondeneme1</button>
<text id="playerwho">player who ? </text>
</body>
</html>
应用.js
var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);
var usernumm = 0;
var usernum1 = [];
app.use(express.static(__dirname + '/'));
server.listen((process.env.PORT || 5000));
io.sockets.on('connection', function(socket) {
var endpoint = socket.manager.handshaken[socket.id].address;
console.log('***New connection from ' + endpoint.address + ':' + endpoint.port);
usernumm++;
usernum1[usernumm] = endpoint.port;
console.log('usernum' + usernumm + 'geldi' + findusernum());
socket.on('disconnect', function() {
usernumm--;
console.log('***Client disconnected');
});
socket.on('getbrowser1', function(data) {
var a = findusernum();
io.sockets.emit('getbrowser1f', a);
});
//finds number of online users
function findusernum() {
for (var i = 0; i < 4; i++) {
if (usernum1[i] == endpoint.port) {
return i;
} else {}
}
}
});
我无法重现您描述的行为,但对于不同的客户endpoint.port
不一定会有所不同。您可能希望改用uuid
。
除此之外,您的代码中还有不同的逻辑问题。
当连接发生时,你写:
usernumm++;
usernum1[usernumm] = endpoint.port;
断开连接后,您将拥有:
usernumm--;
假设您有以下连接顺序:
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 {}
}
这里的问题是,您从0
开始循环,但我们usernum1
的索引0
始终undefined
,因为您在增量后使用usernumm
。这不一定是问题,但它使代码难以阅读,因为您会假设最多有 4 个用户,但实际上您只能有 3 个。
但是回到你的问题而不是socket.manager.handshaken[socket.id].address
你可以使用递增的数字(取决于你的服务将运行多长时间)或一个已经连接的用户不使用的uuid或随机数。
相关文章:
- 使用全局变量来存储数字(JavaScript)
- 如何在html中将字符串转换为数字?以及如何将变量传递到scriptlet代码中
- 如何在javascript中一旦变量达到某个数字就对其进行更改
- 通过变量在两个数字之间切换
- 增加DIV数字变量的按钮
- 每次使用 Javascript 加载页面时增加一个数字(变量)的简单方法
- 添加两个数字变量将返回 NaN
- Javascript数字变量比较不起作用
- 通过参数更新数字变量的函数无法正确更新数字变量
- 在 Node.js 中为不同的浏览器提供不同的数字变量
- 无法对数字变量调用 toFixed
- 设置选项接受一个数字变量,拒绝另一个数字变量
- 检查输入的数字变量
- 数字变量总是未定义的
- 如何将Javascript数字变量转换为特定的单词
- 如何得到一个双随机数,并把它的数字变量
- 在JS中使用if语句和数字变量
- javascript字符串和数字变量
- 更新输入数字变量onclick
- 如何将数字变量添加到不同变量中的对象