使用clients.length的Socket.io困境(其中clients === io.sockets.clients();)

时间:2012-04-22 05:22:41

标签: javascript node.js socket.io

通常,当我从一个客户端向另一个客户端发送一些JSON时,它可以正常工作。但是如果只有一个客户端,它仍然会发送数据包。我的解决方案是(在服务器端,在node.js中):

var clients = io.sockets.clients();

if(clients.length > 1){
// send stuff to other client
}

但是当我这样做时,会出现一些非常奇怪的事情。我将打开一个客户端,开始在if语句中发起操作,而控制台在发送之前打印JSON,什么都不做,因为只有一个客户端。当我在if语句中打开另一个客户端并发起操作时,控制台将打印出JSON并将其发送给我的其他客户端。但是,如果我转到我打开的第一个客户端并在if语句中发起操作,控制台将不会打印任何内容,并且它不会发送任何内容。为什么?我尝试将if语句更改为:

if("hello" === "hello"){
// do the same stuff as before
}

并且两个客户端都可以相互发送JSON,但因为我已经更改了if语句,一个客户端打开,我仍然会发送无用的数据包。出于显而易见的原因,最佳情况是如果它不会发送带有一个客户端的数据包,但会正确地发送数据包不止一个。

我希望这很清楚,如果不是,我很抱歉。

如果需要,我会发布更多代码。

修改

以下是更新数组的代码:

var clients = io.sockets.clients();

io.sockets.on("connection", function (socket) {
clients.length++;
socket.on("disconnect", function() {
clients.length--;
console.log(clients.length + " clients are connected");
});
console.log(clients.length + " clients are connected");
});

2 个答案:

答案 0 :(得分:0)

最近没有做过任何note.js,也许这是假的。但我想:也许客户变量是在他连接时为每个客户定义的,以后不会更新。这对我来说似乎是个逻辑。我认为您需要做的是:在新客户端连接时向所有客户端发出事件,并更新“clients”变量。

答案 1 :(得分:0)

我不确定你的代码是如何工作的(这是什么:clients.length++?增加数组的长度??)但尝试以“正常”方式执行此操作:

var clients;

io.sockets.on("connection", function (socket) {
  clients = io.sockets.clients();
  socket.on("disconnect", function() {
      clients = io.sockets.clients();
      console.log(clients.length + " clients are connected");
  });
  console.log(clients.length + " clients are connected");
});

甚至更好(不保留对已连接用户的全局引用):

function get_clients() {
  var clients = io.sockets.clients();
  console.log(clients.length + " clients are connected");
}

io.sockets.on("connection", function (socket) {
  socket.on("disconnect", function() {
    get_clients();
  });
  get_clients();
});

因为io.sockets.clients()在调用它时会返回所有已连接客户端的数组(这可能就是为什么你会遇到这种奇怪的行为)。