您的位置:首页 > 数据库 > Redis

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

2017-09-05 08:48 941 查看
基于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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: