2013-09-08 1 views
0

У меня есть сервер Node, который отправляет потоковые твиты клиентам по мере их подключения, используя Sockets.io и ntwitter. На данный момент все твиты (от разных пользователей) отправляются каждому клиенту. Но для каждого клиента требуется только определенный набор твитов, и я хотел бы, чтобы сервер отправлял только это подмножество (или категорию).Отправка подмножеств потоковых данных клиентам Node с использованием Sockets.io

I думаю, что каждая категория, похожая на комнату, в сокетах, будет работать, но я не могу точно определить, как адаптировать мой код для их использования. Или, учитывая, что между клиентами нет связи, может быть, это не лучшее решение?

Соответствующие, упрощенные, биты текущего кода ...

Клиент:

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() части в настоящее время отправки каждый твит, чтобы все клиентов. И затем клиент решает, показывать ли это твит, если он находится в категории клиента. Очевидно, что было бы более эффективно, если бы сервер отправлял только твиты клиентам в правильной категории. Учитывая, что сервер уже знает, какие твиты в каких категориях, как я могу испустить их только для этих категорий, а не для каждого клиента?

ответ

0

После некоторых проб и ошибок, похоже, у меня это работает. Не знаю, если это лучший или правильный способ, но ... приведенный выше код был изменен, так что теперь это похоже на то, что показано ниже. Есть одно дополнение к клиентскому коду, а два - к серверному коду.

Клиент:

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

Таким образом, когда клиент подключается он посылает сообщение 'подписываться', и название комнаты она хочет присоединиться.

Когда сервер получает событие «подписаться», он отправляет только существующие твиты, связанные с этой комнатой (логика получения этого списка твитов выполняется в другом месте, не имеет отношения к этой конкретной проблеме).

И всякий раз, когда новый твит берется сервером, он находит комнаты, с которыми связано это твит, а затем издает твит каждого клиента в каждом из них.

Кажется, что это работает ... укажите то, что не имеет смысла или может быть сделано намного лучше!

Смежные вопросы