Pertanyaan Buat daftar Klien Terhubung menggunakan socket.io


Berikut 2 pertanyaan terkait. Mempostingnya bersama lebih masuk akal.

pertanyaan 1

Saya memiliki aplikasi node.js yang memancarkan acara ke semua klien, dan semua klien saat ini akan merespons dengan ready memancarkan. Bagaimana saya bisa membuat daftar semua klien yang menjawab emit awal, dan identifikasi seperti apa yang dapat digunakan untuk membedakan klien?

Question2: 

Apa yang saya coba lakukan setelah mengumpulkan daftar klien yang terhubung, adalah untuk kemudian mengakses tabel database MySQL N jumlah baris dan menetapkan setiap klien X baris masing-masing. Baris-baris ini akan dipancarkan kembali ke klien masing-masing. Bagaimana ini bisa dilakukan?

Kode Saat Ini untuk Qn 1

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

Kode JS Sisi Klien

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

Kode Saat Ini untuk Qn 2 Kode ini berfungsi untuk satu klien, tetapi bagaimana cara mengulang melalui semua klien yang terhubung dan melakukan pembaruan kolom dan memilih baris yang sama?

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
2017-11-27 06:54


asal


Jawaban:


Anda harus melacak sendiri klien yang terhubung. Cara sederhana untuk melakukannya adalah menggunakan larik:

var clients = [];

io.sockets.on('connect', function(client) {
    clients.push(client); 

    client.on('disconnect', function() {
        clients.splice(clients.indexOf(client), 1);
    });
});

Maka Anda bisa referensi itu clients larik di server di mana pun Anda perlu, di ready pengendali event atau apa pun. Sesuatu seperti:

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
2017-11-27 09:21



Socket.io memberi Anda api publik untuk itu, jadi alih-alih meretas sesuatu seperti yang disarankan Bryan, Anda dapat menggunakan:

io.sockets.clients()

Itu akan mengembalikan array dari semua klien yang terhubung.

Jika Anda ingin semua klien terhubung ke namespace tertentu:

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

Tetapi Anda bahkan dapat memfilternya lebih lanjut .. jika Anda ingin memiliki semua soket di sebuah ruangan:

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

Akan mengembalikan array soket yang terhubung untuk ruangan room name here as first argument


20
2017-11-28 23:01