Создайте список подключенных клиентов, используя socket.io
Вот два связанных вопроса. Публикация их вместе имеет смысл.
Вопрос 1
У меня есть приложение node.js, которое выдает событие всем клиентам, и все текущие клиенты ответят с помощью ready
emit. Как я могу создать список всех клиентов, которые ответили на исходный выброс, и какой идентификатор можно использовать для различения клиентов?
Вопрос 2:
То, что я пытаюсь сделать после сбора списка подключенных клиентов, заключается в том, чтобы затем получить доступ к таблице базы данных MySQL из N
количества строк и назначить каждому клиенту X
строк каждый. Эти строки будут возвращены соответствующим клиентам. Как это можно сделать?
Текущий код для Qn 1
Node Код
setInterval(function() {
util.log('Checking for new jobs...');
dbCheckQueue(function(results) { // checks if there are new rows to "distribute" to clients
if (results.length) {
util.log(results.length + ' new jobs found.');
io.sockets.emit('job_available');
}
});
}, 10*1000);
Клиентский JS-код
socket.on('job_available', function() {
console.log('Job Available.. Responding with Ready!');
socket.emit('ready');
});
io.sockets.on('connection', function(socket) {
socket.on('ready', function() {
// UPDATE N rows with client_id in column checkout.
// Then SELECTS * from table where checkout = client_id
getListings(client_id, function(listings) {
socket.emit('job', listings); // send jobs
});
});
});
Текущий код для Qn 2
Код работает для одного клиента, но как я прохожу через все подключенные клиенты и выполняю то же обновление столбца и выбор строк?
io.sockets.on('connection', function(socket) {
socket.on('ready', function() {
// UPDATE N rows with client_id in column checkout.
// Then SELECTS * from table where checkout = client_id
getListings(client_id, function(listings) {
socket.emit('job', listings); // send jobs
});
});
});
Ответы
Ответ 1
Вам нужно будет следить за подключенными клиентами самостоятельно. Простым способом сделать это будет использование массива:
var clients = [];
io.sockets.on('connect', function(client) {
clients.push(client);
client.on('disconnect', function() {
clients.splice(clients.indexOf(client), 1);
});
});
Затем вы можете ссылаться на массив clients
на сервере, где вам нужно, в обработчике событий ready
или что-то еще. Что-то вроде:
io.sockets.on('connection', function(socket) {
socket.on('ready', function() {
// UPDATE N rows with client_id in column checkout.
// Then SELECTS * from table where checkout = client_id
clients.forEach(function(client, index) {
var client_id = index; // Just use the index in the clients array for now
getListings(client_id, function(listings) {
socket.emit('job', listings); // send jobs
});
});
});
});
Ответ 2
Socket.io предоставляет вам публичный api для этого, поэтому вместо того, чтобы взломать что-то вроде Bryan, вы можете использовать:
io.sockets.clients()
Это вернет массив всех подключенных клиентов.
Если вы хотите, чтобы все клиенты подключались к определенному пространству имен:
io.of('/namespace').clients()
Но вы можете даже фильтровать его еще больше. Если вы хотите иметь все сокеты в комнате:
io.sockets.clients('room name here as first argument')
Вернет массив подключенных сокетов для комнаты room name here as first argument