本文根据socket.io与Redis来实现基本的聊天室应用场景,主要表现于多个浏览器之间的信息同步和实时更新.node
只是简单记录了一下, 更详细的内容能够参考后续的一篇补充文章: 使用node.js + socket.io + redis实现基本的聊天室场景.python
首先看下基本的应用场景:多个浏览器同时跟webServer链接,可实时获取webServer推送的数据,如显示某一项实时更新的数据,多个client之间同步消息等.mysql
这里,须要使用到socket.io和redis的publish机制.web
1, socket.io链接于浏览器和nodejs的http服务器之间,可用于两者之间同步数据.redis
2, redis是一种key-value的数据库,可采用发布/订阅(subscribe/publish)机制,能够订阅一个频道以接收主服务器发布的全部消息记录.sql
大概的流程图以下,主要分为三部分,数据库
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.on("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链接的浏览器客户端.