下面我们要做的就是把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:;
padding:5px;
clear:both;
display:block;
width:%;
}
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数据库最新信息到客户端的更多相关文章

  1. nodejs实现百度实时推送

    想要加快百度收录,肯定免不了链接提交吧,当然链接提交的方式有很多种,今天来说一下百度的实时推送.. 第一次看到这post请求确实有点萌逼,我自己是做前端的对后台接触确实不多,见到的前端发送post请求 ...

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

    技术背景 Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新. 应用场景: 监控系统:后台硬件热插拔.LED.温度.电压发生变化 即 ...

  3. dwr3+spring实现消息实时推送

    最近项目要实现一个消息推送的功能,主要就是发送站内信或者系统主动推送消息给当前在线的用户.每次的消息内容保存数据库,方便用户下次登录后也能看到.如果当前用户在线,收到站内信就主动弹出提示.一开始想到的 ...

  4. javascript跨域传递消息 / 服务器实时推送总结

    参考文档,下面有转载[非常好的两篇文章]: http://www.cnblogs.com/loveis715/p/4592246.html [跨源的各种方法总结] http://kb.cnblogs. ...

  5. 利用socket.io实现消息实时推送

    最近在写的项目中存在着社交模块,需要实现这样的一个功能:当发生了用户被点赞.评论.关注等操作时,需要由服务器向用户实时地推送一条消息.最终完成的项目地址为:socket-message-push,这里 ...

  6. SignalR实时推送

    SignalR 的实现机制与 .NET WCF 或 Remoting 是相似的,都是使用远程代理来实现.在具体使用上,有两种不同目的的接口:PersistentConnection 和 Hubs,其中 ...

  7. HTML5 WebSocket 实时推送信息测试demo

    测试一下HTML5的websocket功能,实现了客户端→服务器实时推送信息到客户端,包括推送图片: websocket实现MessageInbound类 onTextMessage()/onBina ...

  8. 基于Node.js的实时推送 juggernaut

    基于Node.js的实时推送 juggernaut Juggernaut 基于 Node.js 构建.为浏览器和服务器端提供一个实时的连接,可在客户端和服务器端进行数据的实时推送,适合多角色游戏.聊天 ...

  9. php 实时推送代码

    网站质量不错的网站可以在百度站长平台/数据提交/sitemap栏目下看到实时推送的功能, 目前这个工具是邀请开放, 百度的实时推送的api接口可以实时推送我们新发布的文章, 保证百度在第一时间收录. ...

随机推荐

  1. sql数据库恢复神器--Log Explorer 4.2使用教程

    对于程序员来说,世界最悲催的事情是什么?——就是手贱,把数据库的数据给删掉了,更悲催的是木有任何数据库备份  感谢万能的度娘,感谢无私奉献的网友们,最感谢强大的LogExplorer工具 . 使用Lo ...

  2. UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv

    原文:UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) ...

  3. Computer system with dual operating modes

    A system switches between non-secure and secure modes by making processes, applications, and data fo ...

  4. 简述WPF中的画刷(Brush)

    原文:简述WPF中的画刷(Brush) -------------------------------------------------------------------------------- ...

  5. ude—基于udp的全双工可靠传输协议

    ude是一款基于udp的可靠传输协议,专门用于在数据传输方面对实时性要求较高的应用领域.    tcp协议虽然能保证数据的可靠传输,但它有以下几个缺点:1.tcp的数据确认机制会导致发送方重复发送一些 ...

  6. WPF4文字模糊不清晰、边框线条粗细不一致的解决方法

    原文:WPF4文字模糊不清晰.边框线条粗细不一致的解决方法 软件测试过程中发现在一台1600*900的分辨率电脑上文字模糊,甚至某些个文字出现压缩扭曲 经过实践,发现按下面方法能解决一点问题: 在窗口 ...

  7. 在Eclipse安装ADT

    Eclipse 3.4 (Ganymede) 启动 Eclipse,然后选择 Help > Software Updates….在出现的对话框中.单击 Available Software 选项 ...

  8. Altera公司高速PCB布线指南

    来至Altera公司的高速PCB布线指南,该文档言简意赅,深入浅出,对于日常高速PCB布局布线中经常碰到的一些问题进行了解析.例如:板材的选择,介电常数及损耗因子对高速高频线路的影响,传输线,阻抗控制 ...

  9. ASP.NET Core 配置身份验证

    以AspUser的Password为例,去掉最少1个大写字母,1个小写字母等等坑爹的要求在Startup的ConfigureServices中进行配置 services.Configure<Id ...

  10. C/C++ static用法

    这篇文章没有太多的实际内容,简单记录下static的用法.顺便试一下用markdown来写文章. 1. 在函数中使用 我们都知道在一个函数中的变量是存储在栈区中,函数的每一次调用都伴随着变量的重新定义 ...