使用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;
            width: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>\n" +
                         "<dd>" + article.author + "\n" +
                         "<dd>" + article.description + "\n"
                         "</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下载

使用Nodejs实现实时推送MySQL数据库最新信息到客户端

时间: 2024-08-10 01:59:29

使用Nodejs实现实时推送MySQL数据库最新信息到客户端的相关文章

nodejs+socketio+redis实现前端消息实时推送

nodejs+socketio+redis实现前端消息实时推送 1. 后端部分 发送redis消息 可以参考此篇实现(直接使用Jedis即可) http://www.cnblogs.com/binyue/p/4763352.html 2.后端部分: 接收redis消息 var redis; if(process.argv.length <= 2){ redis = require('redis').createClient(); }else{ redis = require('redis').c

nodejs实现百度实时推送

想要加快百度收录,肯定免不了链接提交吧,当然链接提交的方式有很多种,今天来说一下百度的实时推送.. 第一次看到这post请求确实有点萌逼,我自己是做前端的对后台接触确实不多,见到的前端发送post请求不是这样发送的.后来研究才知道,原来这个post请求是由服务器来发送的.那么nodejs如何发送这个post请求? //需要推送的网站链接 var content = "https://www.meetqy.com/article?article_id=42"; //对应配置post推送的

用node.js(socket.io)实现数据实时推送

在做商品拍卖的时候,要求在商品的拍卖页面需要实时的更新当前商品的最高价格.实现的方式有很多,比如: 1.setInterval每隔n秒去异步拉取数据(缺点:更新不够实时) 2. AJAX轮询方式方式推送数据(缺点:服务端需要在死循环中反复查询数据库) 3.websocket推送数据(缺点:仅支持html5标准的浏览器) socket.io的简要介绍 所有客户端都通过socket.io挂在nodejs服务器上(注意: 只是挂着,不需要任何循环,因为它是事件驱动的):需要推送消息了,服务器就与nod

【原创】node+express+socket搭建一个实时推送应用

技术背景 Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新. 应用场景: 监控系统:后台硬件热插拔.LED.温度.电压发生变化 即时通信系统:其它用户登录.发送信息 即时报价系统:后台数据库内容发生变化 技术实现方案:ajax long polling(ajax长轮询),comet(http长连接).socket 这里有篇文章介绍了这几种技术,可以看一下. http://www.ibm.com/developerworks/c

基于HTTP协议之WEB消息实时推送技术原理及实现

很早就想写一些关于网页消息实时推送技术方面的文章,但是由于最近实在忙,没有时间去写文章.本文主要讲解基于 HTTP1.1 协议的 WEB 推送的技术原理及实现.本人曾经在工作的时候也有做过一些用到网页消息实时推送的项目,但是当时实现的都不是很完美,甚至有时候是通过 Ajax 轮训的方式实现.在网上也找过不少的资料,真正说到点子上的几乎没有,很多文章大都是长篇大论,说了一些新有名字,什么“HTTP 长连接”,“实时推送”,“Comet 长连接推送技术”等.但真正提到如何实现实时推送的文章倒是没有看

php 实时推送代码

网站质量不错的网站可以在百度站长平台/数据提交/sitemap栏目下看到实时推送的功能, 目前这个工具是邀请开放, 百度的实时推送的api接口可以实时推送我们新发布的文章, 保证百度在第一时间收录. 百度站长平台 http://zhanzhang.baidu.com/ 打开百度站长平台, 点开实时推送的添加新数据接口获得带token的api推送地址: http://ping.baidu.com/sitemap?site=www.yourdomain.com&resource_name=sitem

关于 百度-站长工具 sitemap 实时推送 那点事

相信 站长们对 百度 站长工具 一定不陌生吧!网站地图(sitemap) 文件,站长们也一点都很 熟悉!网站生成 网站地图文件,这样有助于百度蜘蛛在收录时,找到自己喜欢的格式,更好的收录你的网站内容!但这是被动的,只有百度定时来访问!内容收录不是很及时. 但最近 发现百度 站长工具 的 "数据提交"-->"Sitemap" 里面多了一个"实时推送" 功能! 实时推送功能:就是在你发布新内容的时候,通过自己的程序 向百度的 数据推送接口 提交

基于swoole+Redis的消息实时推送通知

swoole+Redis将实时数据的推送 一 实现功能 设计师订单如果设计师未抢单,超时(5分钟)设计订单时时给设计师派送, 设计师公众号中收到派单信息 设计发布者收到派单成功信息 环境 centos6.10 redis-4.0.2 swoole-src-4.4.12 php-7.1.5 MYsyql5.7 在centos6默认是gcc-4.7,安装swoole的时候需要升级到gcc-4.8 二 实现流程 1.开启swoole server端监听 2.开启swoole client连接执行定时执

基于workerman的实时推送

TCP/IP TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. 在应用层有: TCP包括FTP.HTTP.TELNET.SMTP等协议 UDP包括DNS.TFTP等协议 短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接. 也可以这样说:短连接是指SOCKET连接后发送后接收完数据后