使用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连接的浏览器客户端.
使用socket.io+redis来实现基本的聊天室应用场景的更多相关文章
- Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室
一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...
- 使用node.js + socket.io + redis实现基本的聊天室场景
在这篇文章Redis数据库及其基本操作中介绍了Redis及redis-cli的基本操作. 其中的publish-subscribe机制应用比较广泛, 那么接下来使用nodejs来实现该机制. 本文是对 ...
- nodejs + socket.io + redis 新手上路
最近要更新网站架构了,决定转入 nodejs + socket.io + redis 方式. 战斗刚开始: 网上的文章太松散,我根据各个网友的分享进行整理 ,让大家可以方便上手. 进入node.js之 ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- C# Redis辅助类封装与简单聊天室的实现思路说明
虽然redis api的功能比较齐全,但个人觉得为了更好的方便学习和使用,还是很有必有做一个类似DBHelper的帮助类 辅助类主要功能(代码会在最后放出来) 1. 事件监听: 重新配置广播时(主从同 ...
- Java多线程Socket在控制台输出的多人聊天室编程
服务器端代码 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java ...
- Socket.IO聊天室~简单实用
小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ ...
- vue + socket.io实现一个简易聊天室
vue + vuex + elementUi + socket.io实现一个简易的在线聊天室,提高自己在对vue系列在项目中应用的深度.因为学会一个库或者框架容易,但要结合项目使用一个库或框架就不是那 ...
- nodejs的socket.io学习笔记
socket.io学习笔记 1.服务器信息传输: 2.不分组,数据传输: 3.分组数据传输: 4.Socket.io难点大放送(暂时没有搞定): 服务器信息传输 1. // send to curre ...
随机推荐
- git summary
Git 使用经验 缘起 一直想写一篇博文,记录我在使用git时遇到的问题以及解决办法.由于项目忙,偶尔的记录不连续,不成系统.今天有时间记录下来,方便自己以后查看. git 简介及其优势 简单来说,g ...
- tensorflow中的boolean_mask
将mask中所有为true的抽取出来,放到一起,这里从n维降到1维度 tensor = [[1, 2], [3, 4], [5, 6]] import numpy as np mask=np.arra ...
- Java基础82 jsp中的EL表达式(网页知识)
1.EL表达式的作用 EL表达式的作用:向浏览器输出域对象中的变量值或者表达式计算结果.语法:${变量或者表达式} 注: Jsp的核心语法:jsp的表达式<%= %>和jsp的脚本< ...
- delphi TComponent类 2
来自:http://blog.csdn.net/lailai186/article/details/7442385 ------------------------------------------ ...
- python 常用的标准库及第三方库
标准库Python拥有一个强大的标准库.Python语言的核心只包含数字.字符串.列表.字典.文件等常见类型和函数,而由Python标准库提供了系统管理.网络通信.文本处理.数据库接口.图形系统.XM ...
- Jenkins 集成 Sonar
Jenkins 与 Sonar 集成:Sonar 是 Jenkins 之外独立运行的一个服务.Jenkins 中安装插件 SonarQube(并配置其 Sonar Server 的 URL / Acc ...
- Elasticsearch 6.x 的分页查询数据
{ , "query": { "match" : { "person_name" : "张老师" }}, , ], &q ...
- day9--paramiko模块
志不坚者智不达 paramiko:在Linux链接其他机器,每台Linux机器都有一个SSHClient:Python自己也写了一个SSHClient,那么Python写paramiko创建SSHCl ...
- linux 101 hacks 3null 改文件大小写 xargs
禁止标准输出和错误信息的输出 当我们调试 shell 脚本的时候,我们往往不希望看到标准输出和标准错误的信息.我们可以使用/dev/nulll 来禁止标准错误的信息. 将标准输出重定向到/dev/nu ...
- mac系统编译安装ImageMagick7.0.1-3
1.下载源码包: git clone http://git.imagemagick.org/repos/ImageMagick.git 2.编译安装: cd ImageMagick/ ./config ...