zoukankan      html  css  js  c++  java
  • 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确实是一种值得玩味的平台,简单的学习就可以开发出强大的应用。

  • 相关阅读:
    搭建 structs2 环境
    数据库基础
    好书推荐整理
    Java 完美判断中文字符
    中文在unicode中的编码范围
    [转载]爬虫的自我解剖(抓取网页HtmlUnit)
    web应用配置
    简单的Java Web服务器
    dos基本命令
    Unrecognized Windows Sockets error: 0: JVM_Bind
  • 原文地址:https://www.cnblogs.com/happyframework/p/3065902.html
Copyright © 2011-2022 走看看