nodejs+express+websocket+redis实现消息订阅系统

 先看app.js的主要部分

io.sockets.on('connection',function(socket){
    var credis = redis.createClient();
    credis.auth('chenqiguo');
    //订阅一个频道的redis链接
    var subscribe = redis.createClient();
    subscribe.auth('chenqiguo'); //授权
    //创建一个发布消息的redis链接,向指定的频道发送消息
    var publish = redis.createClient(); 
    publish.auth('chenqiguo');//授权
    
    //socket监听发布者在某个channel上发布一条信息
    socket.on('publish',function(channel,data){
        publish.publish(channel,data);
    })
    
    //scoket监听订阅者在客户端订阅一个channel
    socket.on('psubscribe',function(channel,username){
        credis.sadd('user:'+username,channel);  //这里我们把用户每次订阅的channel放到了一个set中
        subscribe.psubscribe(channel);
    })
    
    //服务器接受页面断开重新刷新后重新加载已经订阅的channel(redis的单连接问题)
    socket.on('psuballscribe',function(channelArr,username){
        for(var i=0;i



下面是index.js部分:

exports.index = function(req, res){
  var username = req.session.username; 
  var redis = require('redis').createClient();
  redis.auth('chenqiguo');
  redis.smembers('user:'+username,function(err,results){

    //取得当前用户订阅的所有channel给模板
    res.render('index', { title: 'Express',username:username,result:results});
  });
};

//这里只能让登录的用户有发接受和发布消息(显示这样做不好,但是为了实际说明,就这样了)

exports.login = function(req,res){
    var username = req.body.username;
    if(username != ''){
        req.session.username = username;
        res.redirect('/');
    }
}



下面是index.ejs部分



    
        
        nodejs+websocket+express+redis
        
        
    
    
        <%if(username){%>
        welcome back <%=username%>
you sub
    //这里输出用户一共订阅的channel <%for(var i=0;i
  • <%=result[i]%>
  • <%}%>



publish channel:
publish message:


sed back message from channel
<%}else{%>
<%}%>


你可能感兴趣的:(nodejs)