【问题标题】:Sending subsets of streaming data to Node clients using Sockets.io使用 Sockets.io 向 Node 客户端发送流数据的子集
【发布时间】:2013-09-09 02:51:22
【问题描述】:

我有一个 Node 服务器,它使用 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() 部分当前正在向所有客户发送每条推文。然后客户决定是否显示该推文,如果它在客户的类别中。如果服务器只向正确类别的客户端发送推文,显然会更有效率。鉴于服务器已经知道哪些推文属于哪些类别,我如何只将它们发送到这些类别,而不是每个客户端?

【问题讨论】:

    标签: javascript node.js sockets twitter


    【解决方案1】:

    经过一些试验和错误,我似乎可以正常工作。不知道这是否是最好的或正确的方法,但是......上面的代码已经过调整,所以现在它就像下面显示的那样。客户端代码增加了一项,服务器代码增加了两项。

    客户:

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

    因此,当客户端连接时,它会发送一条“订阅”消息,以及它想要加入的房间的名称。

    当服务器接收到“订阅”事件时,它只发送与该房间关联的现有推文(获取推文列表的逻辑在其他地方完成;与此特定问题无关)。

    每当服务器接收到一条新推文时,它会找到与这条推文相关联的房间,然后将推文发送给每个房间中的每个客户端。

    这似乎行得通...请指出任何没有意义的地方,或者可以做得更好!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2017-05-07
      • 1970-01-01
      相关资源
      最近更新 更多