由于项目中涉及到股票交易,所以对数据的实时性要求很高.最开始用的是http协议,每隔几秒钟请求一次服务器.后来发现这样做给数据库服务器的压力很大.就想着改成推送的方案,经过经个方案的对比和折腾,最后选择了node js+MQTTClient+websocket+(php/c#)方案.折腾过的方案简单总结如下:
方案一:ajax建立长连接,php端不断的循环来确定是否有新的数据(这种方案不可取,时间一久就会消耗大量的服务器资源)
方案二:用nginx-push-stream-module模块(这种方式比较可取,但是发起连接的合法性难以易做图)
方案三:用html5 websocket+php php要写一个服务端程序一直运行(这个做法只对高版本浏览器有用,况且用php写服务端程序感觉效率还是有点差)
方案四:nodejs+websocket.io(采用的方案)
下面说一下最终使用的方案的详细步骤:
一.安装环境和模块
1.安装nodejs环境,可到官网下载http://nodejs.org/
2.安装所需模块(websocket.io,MQTTClient),联网了用nodejs的npm安装即可,如:npm install websocket.io
3.安装mqtt服务
二.实现代码
1.(index.html)前端代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<h1>Real Time</h1>
<script type="text/javascript" src="http://192.168.0.101:5000/socket.io/socket.io.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
<script type="text/javascript">
var socket = io.connect('http://192.168.0.101:5000');
socket.on('connect', function () {
socket.on('sub', function (msg) {
$('#msg').html($('#msg').html()+('<font color="red">'+msg+'<font><br/>'));});
//socket.emit('pub','hello worlds1333');
});
</script>
<h2>信息列表</h2>
<div id="msg">
</div>
|
此文件放于wamp环境下的服务器目录下,如:www/mqtt/index.html
2.(server.js)node js后台代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
var sys = require('sys');
var net = require('net');
var mqtt = require('./client');var io = require('socket.io').listen(5000);
var MQTTClient = require('MQTTClient').Client;
io.sockets.on('connection', function (socket) {
var c = new mqtt.Client('192.168.1.110');
c.connect(function () {
c.subscribe('test', {
qos_level: 1
}, function (topic, qos_level) {
console.log('Topic=' + topic + ' Qos=' + qos_level);
});
});
c.on('error', function (err) {
console.log(err);
});
c.on('publish', function (topic, payload) {
console.log('[' + topic + ']\t' + payload);
socket.emit('sub',String(payload));
});
});
|
其中require的client在https://github.com/leizongmin/MQTTClient下载,将下载的文件的client.js和util.js与server.js放于同一文件下面.我把server.js放于d:/node/mqtt/server.js
这样准备工作就做完了.接下来就是运行和测试了,步骤如下:
1.运行sever.js(cmd->cd d:/node/mqtt->node server.js)
如果看到类似的信息
info – socket.io started
debug – client authorized
,说明运行成功
2.在浏览器中打开index.html(http://localhost/mqtt)
3.在mqtt中发布一条信息,如果浏览器中收到你刚发的信息则说明大功告成了!
以上是我个人实现这个功能的一些代码和方法,还未对其做深入研究,如果你有更好的方法也可以提出来.
原文地址:http://www.yaocheap.com/phptec/252.html