Обновление всех клиентов с помощью Socket.io?

Можно ли принудительно обновлять все клиенты, используя socket.io? Я пробовал следующее, но, похоже, не обновляет другие клиенты, когда подключается новый клиент:

Серверный JavaScript:

Я пытаюсь отправить сообщение всем клиентам, которое содержит текущее количество подключенных пользователей, оно правильно отправляет количество пользователей... однако сам клиент, похоже, не обновляется до тех пор, пока страница не будет обновилась. Я хочу, чтобы это произошло в реальном времени.

var clients = 0;
io.sockets.on('connection', function (socket) {
  ++clients;
  socket.emit('users_count', clients);    
  socket.on('disconnect', function () {
    --clients;
  });
});

Clientside JavaScript:

var socket = io.connect('http://localhost');

socket.on('connect', function(){
  socket.on('users_count', function(data){
    $('#client_count').text(data);
    console.log("Connection");
  });
});

Ответ 1

Он фактически не отправляет обновление другим клиентам, а просто передает только клиенту, который только что подключился (именно поэтому вы видите обновление при первой загрузке)

// socket is the *current* socket of the client that just connected
socket.emit('users_count', clients); 

Вместо этого вы хотите испускать все сокеты

io.sockets.emit('users_count', clients);

В качестве альтернативы вы можете использовать функцию широковещания, которая отправляет сообщение всем, кроме сокета, который его запускает:

socket.broadcast.emit('users_count', clients);

Ответ 2

Я обнаружил, что использование socket.broadcast.emit() будет транслироваться только на текущее "соединение", но io.sockets.emit будет транслироваться всем клиентам, здесь сервер слушает "два соединения", которые в точности равны 2 сокетам пространства имен

io.of('/namespace').on('connection', function(){
    socket.broadcast.emit("hello");
});
io.of('/other namespace').on('connection',function(){/*...*/});

Я попытался использовать io.sockets.emit() в одном пространстве имен, но он был получен клиентом в другом пространстве имен. однако socket.broadcast.emit() будет транслировать текущее пространство имен сокетов.

Ответ 3

Как и в версии socket.io версии 0.9, "emit" больше не работал у меня, и я использовал "отправить"

Вот что я делаю:

Сторона сервера:

var num_of_clients = io.sockets.clients().length;
io.sockets.send(num_of_clients);

Клиентская сторона:

ws = io.connect...
ws.on('message', function(data)
{
var sampleAttributes = fullData.split(',');
if (sampleAttributes[0]=="NumberOfClients")
        {
            console.log("number of connected clients = "+sampleAttributes[1]);
        }
});