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

使用socket.io+redis来实现基本的聊天室应用场景的更多相关文章

  1. Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室

    一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...

  2. 使用node.js + socket.io + redis实现基本的聊天室场景

    在这篇文章Redis数据库及其基本操作中介绍了Redis及redis-cli的基本操作. 其中的publish-subscribe机制应用比较广泛, 那么接下来使用nodejs来实现该机制. 本文是对 ...

  3. nodejs + socket.io + redis 新手上路

    最近要更新网站架构了,决定转入 nodejs + socket.io + redis 方式. 战斗刚开始: 网上的文章太松散,我根据各个网友的分享进行整理 ,让大家可以方便上手. 进入node.js之 ...

  4. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  5. C# Redis辅助类封装与简单聊天室的实现思路说明

    虽然redis api的功能比较齐全,但个人觉得为了更好的方便学习和使用,还是很有必有做一个类似DBHelper的帮助类 辅助类主要功能(代码会在最后放出来) 1. 事件监听: 重新配置广播时(主从同 ...

  6. Java多线程Socket在控制台输出的多人聊天室编程

    服务器端代码 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java ...

  7. Socket.IO聊天室~简单实用

    小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ ...

  8. vue + socket.io实现一个简易聊天室

    vue + vuex + elementUi + socket.io实现一个简易的在线聊天室,提高自己在对vue系列在项目中应用的深度.因为学会一个库或者框架容易,但要结合项目使用一个库或框架就不是那 ...

  9. nodejs的socket.io学习笔记

    socket.io学习笔记 1.服务器信息传输: 2.不分组,数据传输: 3.分组数据传输: 4.Socket.io难点大放送(暂时没有搞定): 服务器信息传输 1. // send to curre ...

随机推荐

  1. oracle11g的冷热备份

    1.冷备份 如果数据库可以正常关闭,而且允许关闭足够长的时间,那么就可以采用冷备份(脱机备份),可以是归档冷备份,也可以是非归档冷备份.其方法是首先关闭数据库,然后备份所有的物理文件,包括数据文件.控 ...

  2. MyEclipse中Source not found的问题

    1.问题描述 在MyEclipse中想查看源码,结果显示:Source not found ......(大概的意思就是找不到源码包) 2.解决方案 下载相应版本的apache-tomcat-8.5. ...

  3. Android浮动窗口的实现

    1.浮动窗口的实现原理 看到上图的那个小Android图标了吧,它不会被其他组建遮挡,也可以响应用户的点击和拖动事件,它的显示和消失由WindowManager直接管理,它就是Android浮动窗口. ...

  4. Flask:redirect()函数

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 重定向,就是在客户端提交请求后,本来是访问A页面,结果,后台给了B页面,当然,B页面中才有需要的信息. 在Flask中 ...

  5. python基础--类的经典类vs新式类

    经典类VS新式类区别 1)写法新式类class Person(object):#new style 经典类class Persion: #classical style 2)调用父类 新式写法用sup ...

  6. AdvStringGrid 单元格字体颜色、背景颜色

    procedure TForm5.Button1Click(Sender: TObject); var I: Integer; begin AdvStringGrid1.RowCount := ;// ...

  7. SQLServer 查看备份进度

    SELECT   DB_NAME(er.[database_id]) [DatabaseName],  er.[command] AS [CommandType],  er.[percent_comp ...

  8. Linux学习笔记:crontab定时任务

    通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本.时间间隔的单位可以是分钟.小时.日.月.周及以上的任意组合.这个命令非常适合周期性的日志分析或数据 ...

  9. Jenkins+Docker持续集成

    本节内容: Jenkins介绍 安装部署Jenkins Jenkins构建maven风格的job Jenkins邮件通知设置 Sonar Jenkins与Docker结合 一.Jenkins介绍 Je ...

  10. 跟我一起学WPF(2):WPF控件基础

    WPF控件简介 通过上一篇XAML语言的介绍,我们知道,XAML是一个树形结构,同样,WPF控件作为构成整个XAML树的一部分,也是一个树形结构.我们看一个简单的例子. <Button.Cont ...