2011-11-27 7 views
8

2つの関連する質問があります。それらを一緒に掲示する方が理にかなっています。socket.ioを使用してConnected Clientsのリストを作成する

質問1

私はすべてのクライアントに出イベントを発するNode.jsのアプリを持っており、現在のすべてのクライアントがready EMITで応答します。どのようにして初期発光に応答したすべてのクライアントのリストを作成できますか?また、どのような識別情報を使用してクライアントを区別することができますか?

Question2:

私は後に接続しているクライアントのリストを集めるんしようとしていますどのような、そして行の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 
     }); 
    }); 
}); 

答えて

16

接続しているクライアントを自分で追跡する必要があります。あなたのreadyイベントハンドラまたは任意に

var clients = []; 

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

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

は、その後、あなたが参照し、サーバー上の clients配列が必要にできるところはどこでもあること、:それを行うための簡単な方法は、配列を使用することです。ような何か:接続されたすべての配列を返すということ

io.sockets.clients() 

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

私は賢い解決策を適用していますが、私はスクリーン上に最初にログインしたユーザー。 – johannesMatevosyan

+0

'getListings'呼び出しは、元の質問から引き出したサンプルコードです。それが何を含んでいるのか、それがどのように実装されているのか分かりません。 – rossipedia

+0

私はクライアントを配列に格納しているので、 'foreach'または' for'ループのheplでそれらを取得しようとすると、私はブラウザで最初にログインしたクライアントのユーザ名だけを取得します。 – johannesMatevosyan

19

Socket.ioそのための公開APIを提供しますので、代わりにブライアンのようなものまでをハッキングのあなたが使用することができます示唆クライアント。

あなたは、特定の名前空間に接続しているすべてのクライアント場合:

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

をしかし、あなたが部屋にすべてのソケットを持っているしたい場合は、さらに...さらにそれをフィルタリングすることができます。

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

を部屋に接続されたソケットの配列を返します。

+0

ありがとう3rdEden、Bryanのソリューションをわずかに変更して使用しました。なぜなら、 'ready'メッセージで返された接続されたクライアントのみが配列にプッシュされるからです。 APIを使用して別の方法で何かできますか? – Nyxynyx

+0

実際にapiを使って少しハッキングするのは、socket.isReady = trueのようなものでした。準備ができたら、あなたは別のリストを手に入れることから自分を救うでしょう:P – ShrekOverflow

+0

これは行く方法です!ありがとう:) –

関連する問題