標籤:des style blog http color 使用 os strong
下面我們要做的就是把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服務,綁定連接埠8080app.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下載