zoukankan      html  css  js  c++  java
  • 使用socket.io+redis来实现基本的聊天室应用场景

    本文根据socket.io与Redis来实现基本的聊天室应用场景,主要表现于多个浏览器之间的信息同步和实时更新.

    只是简单记录了一下, 更详细的内容可以参考后续的一篇补充文章: 使用node.js + 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.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连接的浏览器客户端.

  • 相关阅读:
    how to pass a Javabean to server In Model2 architecture.
    What is the Web Appliation Archive, abbreviation is "WAR"
    Understaning Javascript OO
    Genetic Fraud
    poj 3211 Washing Clothes
    poj 2385 Apple Catching
    Magic Star
    关于memset的用法几点
    c++ 函数
    zoj 2972 Hurdles of 110m
  • 原文地址:https://www.cnblogs.com/huixuexidezhu/p/6796409.html
Copyright © 2011-2022 走看看