使用socket.io+redis來實現基本的聊天室應用情境,socket.ioredis
本文根據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串連的瀏覽器用戶端.
大概地記錄了一下,如有不準確的地方,歡迎批評指正.