nodejs+express+websocket+redis实现消息订阅系统
2013-08-03 21:48
966 查看
先看app.js的主要部分
下面是index.js部分:
下面是index.ejs部分
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<channelArr.length;i++){ subscribe.psubscribe(channelArr[i]); } }) //发布者在某个channel发送消息的时候,订阅频道的redis链接监听这个消息和该频道 subscribe.on('pmessage',function(pattern,channel,message){ socket.emit('message',{channel:channel,data:message}) }) })
下面是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部分
<!doctype html> <html> <head> <meta charset="utf8" /> <title>nodejs+websocket+express+redis</title> <script src="/socket.io/socket.io.js"></script> <script> window.onload = function(){ var socket = io.connect(); var publish = document.getElementById('publish'); var pub = document.getElementById('pub'); var mess = document.getElementById('mess'); var pubmess = document.getElementById('pubmess'); var subscribe = document.getElementById('subscribe'); var content = document.getElementById('content'); var ulList = document.getElementById('ulList'); //当前用户添加一个channel subscribe.onclick = function(){ var username = document.getElementById('username'); socket.emit('psubscribe',mess.value,username.innerHTML); } //当前用户向某一个channel中发布消息 publish.onclick = function(){ socket.emit('publish',pub.value,pubmess.value); } var li = ulList.getElementsByTagName('li'); var channelRes = []; for(var i=0;i<li.length;i++){ channelRes.push(li[i].innerHTML); } //用户刷新的时候把订阅的所有channel再次去请求socket ,完成channel的订阅 socket.emit('psuballscribe',channelRes,username.innerHTML); //订阅了某个channel的所有用户显示消息 socket.on('message', function(message){ var span = document.createElement('span'); span.innerHTML = 'from channel:' + message.channel + '<br />' + 'message:' + message.data; content.appendChild(span); }) ; } </script> </head> <body> <%if(username){%> welcome back <span id="username"><%=username%></span><br /> you sub <ul id="ulList"> //这里输出用户一共订阅的channel <%for(var i=0;i<result.length;i++){%> <li><%=result[i]%></li> <%}%> </ul> <input type="text" id="mess" /> <button id="subscribe">subscribe</button><br /><br /><br /> publish channel:<input type="text" id="pub" /><br /> publish message:<input type="text" id="pubmess" /><br /> <button id="publish">publish</button> <br /><br /> sed back message from channel<br /> <div id="content" style="width:200px; height:200px;background:red"></div> <%}else{%> <form action="/login" method="post"> <input type="text" name="username" /> <input type="submit" value="join" /> </form> <%}%> </body> </html>
相关文章推荐
- NodeJS+Socket.io+ExpressJS实现web聊天应用
- TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(三)
- nodejs+socketio+redis实现前端消息实时推送
- TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(二)
- nodejs+socketio+redis实现前端消息实时推送
- 基于Nodejs的高并发实时消息转发系统 message pusher and written in nodejs based on socket.io and express
- node.js+redis+express 实现发布订阅功能
- Node.Js+Redis+Socket.IO 实现 聊天室或推送消息
- TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(一)
- node-socket实现web的即时聊天系统
- websocket+redis实现即时消息推送思路
- [转载]使用node.js+socket.io搭建实时消息系统
- nodejs+express+socketio实现即时聊天系统初体验
- 构建基于redis+gearman+nodejs 的消息推送系统
- node.js实现微博系统在express3.0+版本下的实现——所遇问题
- web socket+node.js+mysql实现网页在线对战棋牌游戏(超级适合情侣玩)
- 基于node.js+Express.js+Jade+MongoDB开发Web即时聊天系统
- express redis socket 消息提醒方案2:订阅redis,推送消息
- node.js+socket.io 实现一个web聊天室
- NodeJs+Express实现简单的Web增删改查