通常,当我从一个客户端向另一个客户端发送一些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");
});
答案 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()
在调用它时会返回所有已连接客户端的数组(这可能就是为什么你会遇到这种奇怪的行为)。