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连接的浏览器客户端.

  • 相关阅读:
    应该做什么样的研究:以Google为例
    机器学习问题方法总结
    浅析PageRank算法
    轮廓处理函数详细
    近视恢复方法
    一步一步深入视频接口
    什么是cookie
    Linux系统目录数和文件数限制
    九大视频接口全接触
    实时监控网卡流量的命令
  • 原文地址:https://www.cnblogs.com/huixuexidezhu/p/6796409.html
Copyright © 2011-2022 走看看