右下角点一点关注,小礼物走一走!

nodejs redis socketIo

 

后台java在数据变化时将数据存入redis服务器,前台通过node和redis进行响应,使用socket.io更新浏览器数据。

一、本地开发测试安装redis服务器

redis官网 windows 64位地址

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还是其他方面的问题,知道的大牛可以出来普及知识了

 

 

 
 
posted @ 2017-08-26 11:41  DIEW  阅读(1116)  评论(0编辑  收藏  举报