Создайте список подключенных клиентов, используя socket.io - PullRequest
8 голосов
/ 27 ноября 2011

Здесь 2 связанных вопроса. Размещать их вместе имеет смысл.

Вопрос 1

У меня есть приложение node.js, которое отправляет событие всем клиентам, и все текущие клиенты будут отвечать ready. Как я могу создать список всех клиентов, которые ответили на первоначальный выброс, и какую идентификацию можно использовать для различения клиентов?

Вопрос2:

После сбора списка подключенных клиентов я пытаюсь получить доступ к таблице базы данных MySQL с числом N строк и назначить каждому клиенту X строк. Эти строки будут отправлены обратно их соответствующим клиентам. Как это можно сделать?

Текущий код для Qn 1

Код узла

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
        });
    });
});

Ответы [ 2 ]

20 голосов
/ 29 ноября 2011

Socket.io предоставляет вам общедоступный API для этого, поэтому вместо того, чтобы взломать что-то вроде того, что Брайан предлагает вам использовать:

io.sockets.clients()

Это вернет массив всех подключенных клиентов.

Если вы хотите, чтобы все клиенты были подключены к определенному пространству имен:

io.of('/namespace').clients()

Но вы можете даже отфильтровать его еще больше .. если вы хотите, чтобы все сокеты находились в комнате:

io.sockets.clients('room name here as first argument')

Вернет массив подключенных розеток для комнаты room name here as first argument

16 голосов
/ 27 ноября 2011

Вам нужно будет самостоятельно отслеживать подключенных клиентов.Простой способ сделать это - использовать массив:

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
            });
        });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...