Sockets.io と ntwitter を使用して、接続時にクライアントにストリーミング ツイートを送信するノード サーバーがあります。現時点では、(さまざまなユーザーからの) すべてのツイートがすべてのクライアントに送信されます。しかし、各クライアントはツイートの特定のサブセットのみを必要とするため、サーバーにそのサブセット (またはカテゴリ) のみを送信させたいと考えています。
各カテゴリを Sockets の部屋のようなものにすることはうまくいくと思いますが、それらを使用するようにコードを適応させる方法がよくわかりません。それとも、クライアント間に通信がないことを考えると、それは最善の解決策ではないでしょうか?
関連する単純化された現在のコードのビット...
クライアント:
var socket = io.connect(window.location.hostname);
socket.on('messages', function(messages_packet) {
$.each(messages_packet, function(idx, tweet) {
if (tweet_is_in_this_clients_category(tweet)) {
display_messages(messages_packet);
};
}
});
サーバ:
// [A function which, on start-up, fetches existing tweets and caches them.]
// Send cached messages when a client connects.
sockets.sockets.on('connection', function(socket) {
socket.emit('messages', cached_messages);
});
// Fetch tweets from the stream, and send new ones to clients.
twitter.stream('statuses/filter', {follow: [12345, 345678, etc]}, function(stream) {
stream.on('data', function(tweet) {
add_tweet_to_cache(tweet);
sockets.sockets.emit('messages', [tweet]);
}
});
そのため、sockets.emit()
パーツは現在、すべてのツイートをすべてのクライアントに送信しています。そして、そのツイートがクライアントのカテゴリに含まれている場合、クライアントはそのツイートを表示するかどうかを決定します。サーバーが正しいカテゴリのクライアントにのみツイートを送信した場合、明らかにより効率的になります。サーバーがどのツイートがどのカテゴリに属しているかを既に認識している場合、すべてのクライアントではなく、それらのカテゴリにのみ送信するにはどうすればよいでしょうか?