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

Giving different number variables to different browsers in Node.js

本文关键字:数字 变量 浏览器 Node js      更新时间:2023-09-26

我正在尝试为每个客户提供不同的数字。当我单击第一个浏览器上的按钮时,它必须说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或随机数。