设为首页 收藏本站
查看: 639|回复: 0

[经验分享] NodeJs:基于Provider模式的推送服务器实现

[复制链接]

尚未签到

发表于 2017-2-22 11:59:44 | 显示全部楼层 |阅读模式
背景
  企业应用中会有这样的需求,显示最新的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>
  运行效果
DSC0000.png


备注
  NodeJs确实是一种值得玩味的平台,简单的学习就可以开发出强大的应用。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345736-1-1.html 上篇帖子: NodeJs中的非阻塞方法 下篇帖子: 用小语种AutoIt3给Nodejs 写个小工具,方便开启关闭NodeJs服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表