zoukankan      html  css  js  c++  java
  • 使用Nodejs实现实时推送MySQL数据库最新信息到客户端

    下面我们要做的就是把MySQL这边一张表数据的更新实时的推送到客户端,比如MySQL这边表的数据abc变成123了,那使用程序就会把最新的123推送到每一个连接到服务器的客户端。如果服务器的连接的客户端为0,也就是这时候没有客户端连接,那程序也不会执行推送信息的代码以免产生不必要的资源消耗,当有客户端连上的时候又开始推送。demo的代码大家可以到下面的Download按钮去下载。
     
    要运行首先我们要安装nodejs要用到的mysql模块:
    $ npm install mysql

    更多关于mysql模块的使用请访问:https://github.com/felixge/node-mysql

    再安装Socket.io模块:

    $ npm install socket.io
    更多关于socket.io模块的使用请访问:http://socket.io/
     
    新建数据库nodejs,表articles(也可以把表建在你现有的的数据库上,修改一下相应的源代码):
    CREATE DATABASE `nodejs`CHARACTER SET utf8 ;
    USE `nodejs`;
    SHOW DATABASES;
    USE `nodejs`;
    CREATE TABLE `nodejs`.`articles`(`title` TEXT , `author` TEXT ,`description` TEXT);

    进入nodejs-push-MySQL目录运行demo:

    $ node server.js
    测试效果:
    • 打开浏览器输入http://localhost:8080 (可以多开几个,明显能感觉到实时的推送效果)
    • 使用MySQL工具登录到MySQL数据库,修改数据库nodejs里面articles表的数据
    • 一旦表数据被保存,那些打开的客户端将收到最新的更改
    • client.html源代码:
    <html>
        <head>
          <title>使用Nodejs实现实时推送MySQL数据库最新信息到客户端</title>
        <style>
            dd,dt {
                float:left;
                margin:0;
                padding:5px;
                clear:both;
                display:block;
                100%;
                }
                dt {
                background:#ddd;
                }
                time {
                color:gray;
                }
            </style>
        </head>
        <body>
            <time></time>
            <div id="container">Loading ...</div>
        <script src="socket.io/socket.io.js"></script>
        <script src="http://code.jquery.com/jquery-latest.min.js"></script>
        <script>
    
            // 创建websocket连接
            var socket = io.connect('http://localhost:8080');
            // 把信息显示到div上
            socket.on('notification', function (data) {
            var articlesList = "<dl>";
            $.each(data.articles,function(index,article){
                articlesList += "<dt>" + article.title + "</dt>
    " +
                             "<dd>" + article.author + "
    " +
                             "<dd>" + article.description + "
    "
                             "</dd>";
            });
            articlesList += "</dl>";
            $('#container').html(articlesList);
       
            $('time').html('最后更新时间:' + data.time);
          });
        </script>
        </body>
    </html>
    
    //建立MySQL连接, 根据自己环境修改相应的数据库信息
    var app = require('http').createServer(handler),
      io = require('socket.io').listen(app),
      fs = require('fs'),
      mysql = require('mysql'),
      connectionsArray = [],
      connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'root',
        database: 'nodejs',
        port: 3306
      }),
      POLLING_INTERVAL = 1000,
      pollingTimer;
    
    // 检查数据库连接是否正常
    connection.connect(function(err) {
      // 不出现错误信息,那表示数据库连接成功
      console.log(err);
    });
    
    //启动HTTP服务,绑定端口8080
    app.listen(8080);
    
    // 加载客户端首页
    function handler(req, res) {
      fs.readFile(__dirname + '/client.html', function(err, data) {
        if (err) {
          console.log(err);
          res.writeHead(500);
          return res.end('加载客户端首页发生错误...');
        }
        res.writeHead(200);
        res.end(data);
      });
    }
    
    /*
     * 这个就是实现主要功能的方法,间隔3秒去查询数据库表,有更新就推送给客户端
     */
    var pollingLoop = function() {
    
      // 查询数据库
      var query = connection.query('SELECT * FROM articles'),
        articles = []; // 用于保存查询结果
    
      // 查询结果监听
      query
        .on('error', function(err) {
          // 查询出错处理
          console.log(err);
          updateSockets(err);
        })
        .on('result', function(user) {
          // 加入查询到的结果到articles数组
          articles.push(user);
        })
        .on('end', function() {
          // 检查是否有客户端连接,有连接就继续查询数据库
          if (connectionsArray.length) {
            pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL);
    
            updateSockets({
              articles: articles
            });
          }
        });
    
    };
    
    
    // 创建一个websocket连接,实时更新数据
    io.sockets.on('connection', function(socket) {
    
      console.log('当前连接客户端数量:' + connectionsArray.length);
      // 有客户端连接的时候才去查询,不然都是浪费资源
      if (!connectionsArray.length) {
        pollingLoop();
      }
    
      socket.on('disconnect', function() {
        var socketIndex = connectionsArray.indexOf(socket);
        console.log('socket = ' + socketIndex + ' disconnected');
        if (socketIndex >= 0) {
          connectionsArray.splice(socketIndex, 1);
        }
      });
    
      console.log('有新的客户端连接!');
      connectionsArray.push(socket);
    
    });
    
    var updateSockets = function(data) {
      // 加上最新的更新时间
      data.time = new Date();
      // 推送最新的更新信息到所以连接到服务器的客户端
      connectionsArray.forEach(function(tmpSocket) {
        tmpSocket.volatile.emit('notification', data);
      });
    };

     demo下载


  • 相关阅读:
    2016.04.18 view中嵌套两个居中的 lable
    2016..4.06 点菜系统案例:利用文本框的inputView和inputAccessoryView串联UIPickerView、UIDateP...
    2016.04.06 UITabBar+badge.h
    2014 .04 .06 navbar
    2016-03-17 leaks 内存泄露
    2016-03-16 sdwebimage
    2016-03-16 字符串的包含
    2016-03-16 键盘的弹出与收起
    2016-03-15 nsfoundation 数组 字典 nsrange等
    2016-03-15 uitextview placehold
  • 原文地址:https://www.cnblogs.com/jack-Star/p/3880039.html
Copyright © 2011-2022 走看看