后台java在数据变化时将数据存入redis服务器,前台通过node和redis进行响应,使用socket.io更新浏览器数据。
一、本地开发测试安装redis服务器
1.将zip压缩包解压,cmd进入,输入 redis-server redis.windows.conf 运行redis服务器
2.redis 命令行工具(redis-cli),双击打开,输入help查看指令
3.在项目目录下安装redis (cnpm i redis --save)
二、在node里面配置config.js
/*
* config
*/
var options = { RDS_PORT : '6379', //端口号 RDS_HOST : '127.0.0.1', //服务器IP 要连接的A服务器redis RDS_PWD : '', //密码 RDS_OPTS : {}//设置项 }; module.exports = { options:options }
三、app.js
const redis = require("redis"); const options = require("./config"); const redisclient = redis.createClient(options.RDS_PORT,options.RDS_HOST,options.RDS_OPTS); var server = require('http').Server(app);
四、配置reids
redisclient.on('connect',function(){ console.log("redis connect success"); //订阅频道DIEW redisclient.subscribe("DIEW"); });
//我在做这个demo时是通过ajax来调用commit,然后写入redis,redis就进行发布,接着会触发redis的订阅,读取redis中的数据,通过socket.io发送到客户端
//写入redis
router.all("/commit",function(req,res,next){ var commits = JSON.stringify(req.query.data); var name = req.query.data.name; redisclient.set("bidinvest",commits,redis.print); redisclient.publish("DIEW",commits); })
五、连接socket
io.on('connection', function(socket) { redisclient.on('message', function(error, msg) { console.log('socketIo connection'); socket.emit('DIEWMSG', msg); }); })
六、客户端代码
//init socket
var socket = io.connect('http://127.0.0.1:3000/'); //socket connection socket.on('connection', function() { console.log('connection setup for socket.io') }); //socket 订阅的频道 socket.on('DIEWMSG', function(msg) { var objMsg = JSON.parse(msg); var random = parseInt(Math.random()*6)+1; //返回的数据 var html = ''; html+='<li class="row list-group-item"><div class="col-md-2 col-xs-12">'; html+='<img src="/images/avatar/avatar0'+random+'.jpg" alt="llalalalla" class="img-thumbnail text-center avatar">'; html+='<p class="text-center">'+objMsg.name+'</p></div>'; html+='<div class="col-md-10 col-xs-12">'; html+='<p>'+objMsg.txt+'</p></div></li>'; $(".commit-all").append(html); })
注:源码请移步github https://github.com/dai1254473705/node-socket-redis
总结:这只是一个简单的demo,如果需要更多的功能可以到socket.io(https://socket.io/docs/)和redis(https://github.com/NodeRedis/node_redis)上查看文档,
比如设置socket.io连接node端的权限认证,传入参数等等,如果线上服务器使用了nginx,需要ip_hash;保证连接的是同一个端口;如果放到线上环境,
var socket = io.connect('http://127.0.0.1:3000/');可以直接写 var socket = io();这样会自动识别链接地址,默认transports是websocket,如果链接不成功会自动改为轮询机制,如下图:
但是本地开发的时候没有这个问题,只有在线上环境才遇到(线上环境socket和redis相对复杂,但是问题相同),不知道是nginx还是其他方面的问题,知道的大牛可以出来普及知识了