1

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

var clients = io.sockets.clients();

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

但是当我这样做时,会发生一些非常奇怪的事情。我将打开一个客户端,在 if 语句期间开始执行操作,而在发送 JSON 之前打印 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");
});
4

2 回答 2

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()在调用它的那一刻返回所有连接的客户端的数组(也许这就是你得到这种奇怪行为的原因)。

于 2012-04-22T08:06:59.477 回答
0

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

于 2012-04-22T06:11:03.370 回答