node,socket.io - 当新条目添加到新闻源时更新客户端?

时间:2014-12-04 13:34:07

标签: javascript jquery node.js sockets rss

我使用client创建了servernode socket.ioserver正在执行4 get个新闻Feed请求并获取数据。这些数据会以client发送给socket.io

client正在显示特定socket.io事件发生时的新闻Feed。 这适用于一次。这是代码和working fiddle

server.js

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')
  , redis = require("redis");

var http = require("http");

// initialize the container for our data
var data = "";

var nfs = [
    "http://economictimes.feedsportal.com/c/33041/f/534037/index.rss",
    "http://www.timesonline.co.uk/tol/feeds/rss/uknews.xml",
    "http://www.independent.co.uk/news/business/rss",
    "http://www.dailymail.co.uk/money/index.rss"
];

//setInterval(function() {
    for(var i=0; i<nfs.length; i++){
        //console.log(nfs[i]);  
            http.get(nfs[i], function (http_res) {

                // this event fires many times, each time collecting another piece of the response
                http_res.on("data", function (chunk) {
                    // append this chunk to our growing `data` var
                    data += chunk;
                });

                // this event fires *one* time, after all the `data` events/chunks have been gathered
                http_res.on("end", function () {
                    // you can use res.send instead of console.log to output via express
                    console.log("data received");
                });
            }); 
    }
//}, 30000);

app.listen(8080);

function handler (req, res) {
  fs.readFile(__dirname + '/client.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.on('connection', function (socket) {

  //setInterval(function() {
      socket.emit('news', data);
      /*socket.on('my other event', function (data) {
        console.log(data);
      });*/
  //}, 5000);

});

client.html

<html>
    <head>
        <script src="https://cdn.socket.io/socket.io-1.2.1.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
        <script>
            //socket io client
            var socket = io.connect('http://localhost:8080');

            //on connetion, updates connection state and sends subscribe request
            socket.on('connect', function(data){
                setStatus('connected');
                socket.emit('subscribe', {channel:'notif'});
            });

            //when reconnection is attempted, updates status 
            socket.on('reconnecting', function(data){
                setStatus('reconnecting');
            });

            //on new message adds a new message to display

            socket.on('news', function (data) {
                console.log(data);              
                //socket.emit('my other event', { my: 'data' });
                addMessage(data);
            });

            /*socket.on('news', function (data) {
                debugger;
                socket.emit('my other event', { my: 'data' }
                var msg = "";
                if (data) {
                    msg = data; 
                }
            addMessage(msg);
            });*/

            //updates status to the status div
            function setStatus(msg) {
                $('#status').html('Connection Status : ' + msg);
            }

            //adds message to messages div
            function addMessage(msg) {  
                //debugger;
                var $xml = $(msg);
                var html = '';
                $xml.find("item").each(function() {
                    var $item = $(this);                                        
                    html += '<li>' +
                        '<h3><a href ="' + $item.find("link").text() + '" target="_new">' +
                        $item.find("title").text() + '</a></h3> ' +
                        '<p>' + $item.find("description").text() + '</p>' +
                        // '<p>' + $item.attr("c:date") + '</p>' +
                        '</li>';                    
                });             
                $('#result').prepend(html);
}
        </script>
    </head>
    <body>
        <div id="status"></div><br><br>     
        <ul id="result"></ul>       
    </body>
</html>

我对socket.io的理解是,我们不需要长时间的服务器轮询,因此server如何知道新闻被添加到受尊重的新闻Feed中。

当新闻添加到新闻Feed rss时,如何使用新添加的新闻更新client

更新 好的,从所有回复中我都明白socket.io无法知道新条目已被添加。那么,我怎么知道(哪些工具/库需要知道添加了新条目并更新了客户端)???

2 个答案:

答案 0 :(得分:1)

从新闻源中检索消息完全独立于socket.io,除非新闻源在其末端实现套接字并且您的服务器成为其客户端。因此,您必须继续使用http请求轮询它们以了解它们是否已更新数据。

为了通知您的客户您的更新,您只需发出新闻事件。大概你会在服务器上有逻辑,以确保你只发送以前没有发送过的事件。

答案 1 :(得分:0)

&#34;节点&#34;了解新条目何时添加到新闻Feed中。您将不得不像现在一样轮询新闻服务。这与Node或Socket.io无关,除非我完全误解了你的要求。