0

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()パーツは現在、すべてのツイートをすべてのクライアントに送信しています。そして、そのツイートがクライアントのカテゴリに含まれている場合、クライアントはそのツイートを表示するかどうかを決定します。サーバーが正しいカテゴリのクライアントにのみツイートを送信した場合、明らかにより効率的になります。サーバーがどのツイートがどのカテゴリに属しているかを既に認識している場合、すべてのクライアントではなく、それらのカテゴリにのみ送信するにはどうすればよいでしょうか?

4

1 に答える 1

0

いくつかの試行錯誤の後、私はそれが機能しているようです。これが最善の方法であるか正しい方法であるかはわかりませんが、上記のコードは微調整されているため、以下に示すようなものになりました。クライアント コードに 1 つ、サーバー コードに 2 つの追加があります。

クライアント:

var socket = io.connect(window.location.hostname);
// NEW CLIENT PART:
socket.on('connect', function(){
    // room_name was created based on the URL this page was requested at:
    socket.emit('subscribe', room_name);
};

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) {
    // NEW SERVER PART 1:
    socket.on('subscribe', function(room_name) {
        socket.join(room_name);
        socket.emit('messages', cached_messages_for_this_room);
    });
});

// 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);
        // NEW SERVER PART 2:
        // Gets the array of room_names this twitter account is associated with:
        var rooms = get_rooms_for_twitter_account(tweet.user.screen_name);
        rooms.forEach(
            function(room_name) {
                sockets.sockets.in(room_name).emit('messages', [tweet]);
            };
        );
    };
});

そのため、クライアントが接続すると、「subscribe」メッセージと、参加したいルームの名前が送信されます。

サーバーが「サブスクライブ」イベントを受信すると、そのルームに関連付けられた既存のツイートのみが送信されます (ツイートのリストを取得するロジックは別の場所で行われます。この特定の問題には関係ありません)。

そして、新しいツイートがサーバーによって取得されるたびに、サーバーはこのツイートが関連付けられているルームを見つけ、各ルームのすべてのクライアントにツイートを送信します。

これはうまくいくようです...意味をなさないこと、またはもっとうまくできることを指摘してください!

于 2013-09-08T18:51:22.680 に答える