Обновление всех клиентов с помощью 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]);
}
});