nodejs redis socketIo

Posted DIEW

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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还是其他方面的问题,知道的大牛可以出来普及知识了

 

 

 
 

以上是关于nodejs redis socketIo的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS + SocketIO 推送到移动应用

NodeJS + Express Cors + SocketIO = XMLHttpRequest 错误

使用 Nodejs + SocketIO 时丢弃传输错误

NodeJS + SocketIO 大套接字事件管理

如何在nodejs,socketio中检查在线用户?

Nginx + (nodejs, socketio, express) + php 站点