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

本文根據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鏈接的瀏覽器客戶端.

相關文章
相關標籤/搜索