2014-12-04 49 views
0

我已創建clientservernodesocket.ioserver正在執行新聞訂閱的4 get請求並提取數據。這些數據通過socket.io發送到client節點,socket.io - 當新條目添加到新聞源時更新客戶端?

client正在顯示有關特定socket.io事件發生的新聞饋送。 這個效果很好。下面是代碼和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來怎麼知道新聞被添加到受尊重的新聞提要。

如何更新client與新添加的新聞時,新聞添加到新聞源RSS?

更新 好了,所以從所有的答覆我得到的,這是不可能的socket.io知道新條目已復加的地步。那麼,我怎麼知道(哪些工具/庫需要知道添加新條目並更新客戶端)?

回答

1

從新聞訂閱源中檢索消息完全獨立於socket.io,除非消息訂閱源在其末端實現套接字並且服務器成爲其客戶端。所以你將不得不繼續用http請求輪詢他們,以確定他們是否更新了數據。

爲了通知您的客戶更新,您只需發出新聞事件。據推測,你會在服務器上有邏輯,以確保你只發送事先未發送的事件。

+0

感謝您的回答。將'for'循環放在'setInterval'中是不錯的做法?我試過了,但是檢索到相同的數據。你能否介紹一下如何實施/避免這種情況? – Valay 2014-12-06 18:10:04

+0

你可以請讓我知道如何更新客戶端時,新的條目添加到通過節點的新聞Feed?目前它將相同的條目附加到客戶端。 – Valay 2014-12-15 06:16:01

0

「節點」無法知道何時將新條目添加到新聞Feed中。你將不得不像現在所做的那樣輪詢新聞服務。這與Node或Socket.io確實無關,除非我完全誤解了你所問的內容。