使用socket.io+redis來實現基本的聊天室應用場景

jopen 10年前發布 | 88K 次閱讀 電話/通訊/IM聊天 Socket.IO

本文根據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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!