Node.Js+Redis+Socket.IO 实现 聊天室或推送消息

来源:互联网 发布:警察巡逻图片知乎 编辑:程序博客网 时间:2024/05/16 07:13

基于Redis 推送,向Node.Js 推送消息,Node.Js 把 消息推送給 Socket.IO(可以是WebSocket,也可以是long-Polling,由Socket.IO 封装)

需要 Redis服务端,Node.Js需要 redis模块和Socket.IO模块

Node.Js

var redisPusMsgServer = require('http').createServer().listen(1379);


var redis = require('redis'),
    RDS_PORT = 6379,        //端口号
    RDS_HOST = '172.20.20.46',    //服务器IP
    RDS_OPTS = {};            //设置项
var redisclient = redis.createClient(RDS_PORT,RDS_HOST,RDS_OPTS);//redis客户端
//创建redis 推送监听
var sub = function(x){
var x = "RedisTestChannel";
redisclient.select('15', function(error){
       if(error) {
         console.log(error);
       } else {
         redisclient.subscribe(x,function(e){
    console.log('Subscribe Channel:' + x);
     });
       }
    });
}
//执行redis 推送监听
sub();
//输出日志
console.log('redisPusMsgServer running at http://172.20.20.46:1379/');
//创建websocket服务
var io = require('socket.io')(redisPusMsgServer,{
   "serveClient": false ,
   "transports":['websocket', 'polling'] //这个配置可以 告诉socket.io 优先使用 哪个模式,默认是 polling,websocket
 });
//websocket链接后,redis执行监听推送频道 是有消息
io.on('connection',function(socket){
//redis接收到推送消息后,websocket推送給页面
redisclient.on('message',function(error,msg){
console.log('connection');
        console.log(msg);
//触发websocket 接收信息
        socket.emit('msgReceived', msg);
});
//注册接收Web前端消息事件
    socket.on('SendMsg', function(data) {
        console.log('发送消息',data);
        //socket.broadcast用于向整个网络广播(除自己之外)
        socket.broadcast.emit('GetMsg',data);
    });
//断开websocket事件
    socket.on('disconnect', function(data) {
        console.log('断开',data);
        socket.emit('c_leave','离开');
        //socket.broadcast用于向整个网络广播(除自己之外)
        //socket.broadcast.emit('c_leave','某某人离开了')
    });
});


HTML页面

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>socket</title>
  <script type="text/javascript" src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
  <script type="text/javascript" src="jquery-2.1.1.min.js"></script>
 </head>
 <body>
  
   <div style="width:100px; height:200px; border:1px solid red" id="show"></div>
   <button id="sendBtn">发送消息</button>


   <button id="leaveBtn">离开</button>
 </body>
 
 <script type="text/javascript">
// 创建一个Socket实例
// var socket = new WebSocket('ws://localhost:9000');
// socket.onopen = function(event) {
//     // 发送一个初始化消息
//     socket.send('I am zqz_client!');
//     // 监听消息
//     socket.onmessage = function(event) {
//         console.log('收到服务端消息: ', event);
//     };
//     // 监听Socket的关闭
//     socket.onclose = function(event) {
//         console.log('socket关闭: ', event);
//     };
//     // 关闭Socket.... 
//     //socket.close() 
// };
</script>
<script type="text/javascript">
    var div = $("#show");

   //这个配置可以 告诉socket.io 优先使用 哪个模式,默认是 polling,websocket
    var socket=io.connect('ws://127.0.0.1:1379',  {"transports":['websocket', 'polling']}),//与服务器进行连接
        send=document.getElementById('sendBtn'),
        leave=document.getElementById('leaveBtn');
    send.onclick=function(){
        socket.emit('hi', 'hello!');
    }
    leave.onclick=function(){
        window.opener=null;window.close() 
        socket.emit('leave', 'leave');
    }
    //接收来自服务端的信息事件c_hi
    socket.on('c_hi',function(msg){
        alert(msg)
    });
socket.on('msgReceived', function(msg) {
console.log('msgReceived',msg);
div.append(msg + "<br/>"); 
    });
    // socket.on('c_leave',function(msg){
    //     alert(msg)
    // })
</script>
</html>


阅读全文
0 0
原创粉丝点击