nodejs redis socketIo
Posted DIEW
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs redis socketIo相关的知识,希望对你有一定的参考价值。
后台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还是其他方面的问题,知道的大牛可以出来普及知识了
以上是关于nodejs redis socketIo的主要内容,如果未能解决你的问题,请参考以下文章