NodeJs:基於Provider模式的推送服務器實現


背景

企業應用中會有這樣的需求,顯示最新的xxx信息,如:銷售信息、考核信息和公告信息等等。大的方向有兩種模式:push和polling。因為剛學NodeJs,因此就用NodeJs簡單的實現一下。

思路

整個系統可以分為兩部分:一、通信;二、最新消息獲取。

通信部分可以采用:http://socket.io/

最新消息獲取部分為了支持一定的可擴展性,可以定義一個Provider接口,接口簽名如下:

1、method:getFreshMessage(callback),示例:

1 provider.getFreshMessage(function (message) {
2     socket.emit('message', message);
3 });

2、event:message,示例:

1 provider.on('message', function (message) {
2     io.sockets.emit('message', message);
3 });

實現( 代碼下載

我們可以實現一個基於文件的Provider,思路是監聽文件的變化。

FileProvider.js

 1 var fs = require('fs');
 2 var events = require('events');
 3 
 4 var FileProvider = function (fileName, listener) {
 5     var me = this;
 6 
 7     me.fileName = fileName;
 8 
 9     if (listener) {
10         me.on('message', listener);
11     }
12 
13     fs.watchFile(me.fileName, function (curr, prev) {
14         me.getFreshMessage(function (message) {
15             me.emit('message', message);
16         });
17     });
18 };
19 
20 FileProvider.prototype = new events.EventEmitter();
21 
22 FileProvider.prototype.getFreshMessage = function (callback) {
23     var me = this;
24 
25     fs.readFile(me.fileName, 'utf8', function (err, data) {
26         callback(data);
27     });
28 };
29 
30 module.exports = FileProvider;

app.js

 1 var io = require('socket.io').listen(8888);
 2 var FileProvider = require('fresh.message').FileProvider;
 3 var filePath = 'E:/node_study/socket_study/message.txt';
 4 
 5 var provider = new FileProvider(filePath);
 6 
 7 provider.on('message', function (message) {
 8     io.sockets.emit('message', message);
 9 });
10 
11 io.sockets.on('connection', function (socket) {
12     provider.getFreshMessage(function (message) {
13         socket.emit('message', message);
14     });
15 });

index.html

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title></title>
 6 </head>
 7 <body>
 8     <div></div>
 9 </body>
10 </html>
11 <script src="socket.io/socket.io.js"></script>
12 <script>
13     var socket = io.connect('http://localhost:8888');
14     socket.on('message', function (message) {
15         document.body.innerHTML = message;
16     });
17 </script>

運行效果

備注

NodeJs確實是一種值得玩味的平台,簡單的學習就可以開發出強大的應用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM