web-dev-qa-db-ja.com

socket.ioを使用して接続されたクライアントのリストを作成します

ここに2つの関連する質問があります。それらを一緒に投稿する方が理にかなっています。

質問1

すべてのクライアントにイベントを発行するnode.jsアプリがあり、現在のすべてのクライアントはready発行で応答します。最初の送信に応答したすべてのクライアントのリストを作成するにはどうすればよいですか?また、クライアントを区別するためにどのような種類のIDを使用できますか?

質問2:

接続されたクライアントのリストを収集した後、私がやろうとしているのは、N行数のMySQLデータベーステーブルにアクセスし、各クライアントにそれぞれ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
        });
    });
});
8
Nyxynyx

接続されているクライアントを自分で追跡する必要があります。これを行う簡単な方法は、配列を使用することです。

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

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

20
3rdEden