使用socket.io+redis来实现基本的聊天室应用场景

jopen 9年前

本文根据socket.io与redis来实现基本的聊天室应用场景,主要表现于多个浏览器之间的信息同步和实时更新.

首先看下基本的应用场景:多个浏览器同时跟webServer连接,可实时获取webServer推送的数据,如显示某一项实时更新的数据,多个client之间同步消息等.

这里,需要使用到socket.io和redis的publish机制.

1, socket.io连接于浏览器和nodejs的http服务器之间,可用于二者之间同步数据.

2, redis是一种key-value的数据库,可采用发布/订阅(subscribe/publish)机制,可以订阅一个频道以接收主服务器发布的所有消息记录.

大概的流程图如下,主要分为三部分,

20141123193800218.png

1, chat.js,

    建立一个node.js的http server,与浏览器建立socket.io连接,可以通过该socket.io连接将数据发送给各个浏览器,

    同时,创建一个redis的客户端,订阅redis-server的一个频道(如chat频道),

    主要代码如下:

    // chat.js

    var http = require("http");

    var server = http.createServer().listen(4000);

    var io = require("socket.io")(server);

    

    var redis = require("../socket.io/node_modules/redis");

    var sub = redis.createClient();

    sub.subscribe("chat"); // 订阅chat频道

 

    io.on("connection", function(socket){

        sub.on("message", function(channle, msg){ // chat频道一旦接收到消息msg,则立即向socket.io连接中发送该msg数据.

            console.log("redis on message", msg);            

            socket.emit("msgReceived", msg);

        })

    })

    注意,该chat.js的http server要一直运行,同时与浏览器和redis-server建立连接或监听.

2, 向redis-server的chat频道发布消息,

    可以采用redis-cli的方式:

    redis-cli -h localhost -p 6379

    向chat频道发送简单的消息1234567890

    publish chat 1234567890

    也采用python的的redis模块:

    import redis

    r = redis.StrictRedis(host="localhost", port=6379, db=0)

    r.publish("chat", "1234567890")

    并且,redis-server也要一直运行.

    那么,通过redis的chat频道发布消息,则订阅该频道的chat.js就能收到并做相应处理.

3, 最后,浏览器端如何接收socket.io中传递的数据呢?也很简单.

    在js代码中,

    <script src="http://localhost:4000/socket.io/socket.io.js"></script>

    var socket = io("http://localhost:4000")

    socket.io("connection", function(){

        console.log("connection setup for socket.io !")

    })

    socket.on("msgReceived", function(data){ // 这里的msgReceived要与chat.js中的emit方法的参数对应起来

        // 对于data数据的处理过程

    })

 

    那么至此,就可以在后端通过redis-cli或者python语句,向redis-server的chat频道发布消息,而chat.js订阅的该chat频道.

然后,chat.js再将消息通过socket.io同步给所有与其建立socket.io连接的浏览器客户端.

来自:http://blog.csdn.net/icetime17/article/details/41412373