本文根据socket.io与redis来实现基本的聊天室应用场景,主要表现于多个浏览器之间的信息同步和实时更新.
首先看下基本的应用场景:多个浏览器同时跟webServer连接,可实时获取webServer推送的数据,如显示某一项实时更新的数据,多个client之间同步消息等.
这里,需要使用到socket.io和redis的publish机制.
1, socket.io连接于浏览器和nodejs的http服务器之间,可用于二者之间同步数据.
2, redis是一种key-value的数据库,可采用发布/订阅(subscribe/publish)机制,可以订阅一个频道以接收主服务器发布的所有消息记录.
大概的流程图如下,主要分为三部分,
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连接的浏览器客户端.
大概地记录了一下,如有不准确的地方,欢迎批评指正.