使用Tornado和Redis构建简易聊天室

[size=medium] Tornado是一个异步Python框架,最初由FriendFeed发起并开源,目前由Facebook维护,非常适合实时做Web应用。
Redis是一个NoSQL数据库,常用于做缓存系统,这里主要用到了它的Pub/Sub功能。即当一个用户发送一条消息时,所有的用户都会收到消息。
关于什么是Ajax长轮询(Comet)不再介绍

我是参照the5fire的一篇博客来组织项目源码的:[url]http://www.the5fire.com/tornado-mvc-helloworld-2.html[/url]

当Tornado收到浏览器的消息时,将这条消息publish到Redis里,所有的subscriber就都会收到通知。[/size]

def post(self) : #接受POST请求
name = self.get_secure_cookie('name')
msg = self.get_argument('msg', '')

if name == '':
name = 'Anonymous'

data=json_encode({'name':name, 'msg':msg})
c.publish('test_channel', data) #收到将消息publish到Redis
self.write(json_encode({'result':True}));
self.finish();

[size=medium]

将Tornado超时时间设置为60s,如果在60s内,收到了Redis的消息,就把消息发送给浏览器;如果60s超时了,则发送一条msg为空的消息给浏览器。[/size]

import time
import tornado.web
import tornado.gen
import tornadoredis
from tornado.escape import json_encode
from model.entity import Entity

class LongPollingHandler(tornado.web.RequestHandler):

def initialize(self):
self.client = tornadoredis.Client()
self.client.connect() #连接到Redis

@tornado.web.asynchronous
def get(self):
self.get_data()

@tornado.web.asynchronous
def post(self):
self.get_data()

@tornado.gen.engine
def subscribe(self): #订阅Redis的消息
yield tornado.gen.Task(self.client.subscribe, 'test_channel')
self.client.listen(self.on_message)


def get_data(self):
if self.request.connection.stream.closed():
return

self.subscribe()

num = 60 #设置超时时间为60s
tornado.ioloop.IOLoop.instance().add_timeout(
time.time()+num,
lambda: self.on_timeout(num)
)


def on_timeout(self, num):
self.send_data(json_encode({'name':'', 'msg':''}))
if (self.client.connection.connected()):
self.client.disconnect()

def send_data(self, data): #发送响应
if self.request.connection.stream.closed():
return

self.set_header('Content-Type', 'application/json; charset=UTF-8')
self.write(data)
self.finish()


def on_message(self, msg): #收到了Redis的消息
if (msg.kind == 'message'):
self.send_data(str(msg.body))
elif (msg.kind == 'unsubscribe'):
self.client.disconnect()

def on_finish(self):
if (self.client.subscribed):
self.client.unsubscribe('test_channel');


[size=medium]

浏览器JavaScript代码如下,每当服务器返回结果以后,就立即再发送一个请求到服务器。因为空闲的时候,服务器要等60s才会有响应,所以这并不会消耗很多资源。[/size]

var updater = {
poll: function(){
$.ajax({url: "/longpolling",
type: "POST",
dataType: "json",
success: updater.onSuccess,
error: updater.onError});
},
onSuccess: function(data, dataStatus){
try{
if (data.msg != "") {
$("p").append(data.name+": " + data.msg + "<br />");
}
}
catch(e){
updater.onError(e);
return;
}
updater.poll(); //收到响应后立即再发一条请求
},
onError: function(e){
if (e.message)
console.log("Poll Error" + e.message);
else
console.log(e);
}
};

updater.poll();


[size=medium]全部代码参见我的git:[url]https://github.com/wylazy/tornado-chat[/url][/size]
基于Python Tornado框架的果蔬采购配货系统毕业设计项目 简介:本毕业设计项目基于Python Tornado框架开发了一套完整的果蔬采购配货系统,涵盖用户管理、商品管理、订单处理、库存控制和配送管理等核心功能。Tornado作为高性能异步Web框架,有效支持高并发场景下的稳定运行。系统采用RESTful API实现前后端分离,结合数据库设计与ORM技术完成数据持久化,并集成第三方支付接口。项目还注重安全性设计,支持HTTPS传输、密码加密及常见攻击防护,通过单元测试与Docker容器化部署保障系统稳定性,是典型的Web应用实战案例。 阅读详情

相关推荐

tornado-redis:简单的异步 Tornado-redis 连接器

龙卷风-redis 简单的异步 Tornado-redis 连接器 去做: 处理与 ioloop.WRITE 的连接 处理第二次和更多读取操作

tornado-redis入门

tornado-redis github 地址:https://github.com/leporo/tornado-redis 介绍 tornado-redis 包,一个 tornado 可用的异步 redis client。但已不在维护。 tornado-redis连接数据库 1.普通连接(未使用连接池池) import tornadoredis c = tornadoredis.Client(host="127.0.0.1",port=6379) # 测试是否连接成功,写一个key,并查看red

y355356475的博客 895

Python-一个基于Tornadomongodbredis的社区系统

一个基于Tornado/mongodb/redis的社区系统

【亲测免费】 Tornado-Redis:为Tornado框架打造的高效Redis客户端

Tornado-Redis:为Tornado框架打造的高效Redis客户端 项目简介 是一个专门为 Python 的 Tornado Web 框架 设计的 Redis 客户端库。它提供了全面的 Redis 命令支持,并优化了与 Tornado 并发模型的集成,使开发者能够充分利用异步I/O的优势,实现高性能、低延迟的数据存储和检索。 技术分析 Tornado-Redis的核心特性在于其异步设计,它...

gitblog_00013的博客 625

非诚勿扰聊天实现,tornado + redis

NULL 博文链接:https://edisonlz.iteye.com/blog/1679114

深入解析i2cdetect:从基础命令到高级读写操作

本文深入解析Linux下i2cdetect工具,从基础安装、总线扫描到高级读写操作。作为i2c-tools的核心组件,i2cdetect是硬件调试的得力侦探,能快速识别I2C总线上的设备地址。文章还涵盖了i2cdump、i2cset、i2cget等进阶工具,并介绍了如何在C程序中调用读写接口进行嵌入式开发,是掌握I2C通信调试的实用指南。

weixin_29189987的博客 372

tornado-redis的使用

因为tornado-redis比较旧了,所以配套的tornado也得比较旧,最高版本是tornado 4.5.3,5.x.x上以的版本会出现以下错误: ERROR:tornado.application:Uncaught exception GET / (127.0.0.1) HTTPServerRequest(protocol='http', host='127.0.0.1:8888', met...

weixin_43620243的博客 2222

汽车底盘技术解析:从悬架调校到智能化,如何评价国产车底盘实力

汽车底盘作为决定车辆驾驶质感、安全性和耐久性的核心系统,其技术内涵远不止于悬架结构。从行驶系、转向系到制动系的协同工作,底盘调校是一门融合机械原理与工程实践的艺术。在电动化与智能化浪潮下,底盘技术正经历从被动适应到主动响应的变革,CDC可变阻尼减震器和空气悬架等技术的应用,让底盘具备了通过OTA升级实现性能优化的可能。国产汽车品牌如奇瑞、吉利等,通过平台化架构研发与调校经验积累,正推动底盘技术从“能用”向“好用”乃至“塑造独特驾驶风格”迈进。理解底盘技术,需超越简单的结构对比,关注其在实际路况中的滤震性、支

weixin_34413103的博客 387

tornado redis mysql_tornado-redis入门

#!/usr/bin/env python#encoding: utf-8importasyncioimportdatetimeimportcollectionsimporttime as mod_timefrom asyncio importFuturefrom collections importnamedtuple, dequefrom tornado.tcpclient importTCP...

weixin_42562124的博客 254

每天一个优秀提示词学习收藏 - 文本创作篇(二)

宝子们,今天不藏私啦!我把这段时间四处搜罗、潜心钻研出来的文本创作 Prompt 提示词大礼包双手奉上,这可都是能让你的 AI 创作水平原地起飞的干货!走过路过不要错过,赶紧码住,开启你的 AI 创作进阶之旅吧!

2402

CocosCreator 面试题(十五)Cocos Creator如何内置protobuf JS版本?

接着,它创建了一个 Player 对象,并使用 protobuf.js 提供的 API 对其进行序列化和反序列化操作。其中,name 和 level 是普通的字段,items 是一个 repeated 字段,表示它可以包含多个值。在 Cocos Creator 中使用 protobuf.js,我们需要先加载 .proto 文件,然后使用 protobuf.js 提供的 API 进行序列化和反序列化操作。JSON和XML是文本格式,更易于阅读和调试,而且在对人类友好的接口和数据交换上更为常见和广泛支持。

w风雨无阻w的专栏 2628

python vuejs聊天室_tornado与vue.js解决web一对一实时聊天(IM)

记录一下这个阶段遇到的一些问题。解决方案:前端vue.js+ajax后端django rest framework + tornado用户鉴权用JWTredis做系统缓存一.前后端鉴权问题1.django api鉴权django通过鉴定http请求头的Authorization头部,进行鉴权。当收到请求时,主要是以下方面的问题:该token是否真实有效该token所代表的用户是否为唯一登录该tok...

weixin_39724362的博客 399

【清华大学软院】15-19年推免试题历年整理

整理的题目为清软预推免机试(外校)硕士机考题目。 年代 题目1 题目2 题目3 2019 质因数分解 二叉搜索树 区间DP(折叠字符串) 2018 日期转换 高精度模拟 区间DP(戳气球) 2017 进制素数 被遗漏的数字 DP(收集苹果) 2016 大数运算 DP DFS 2015 进制素数: http://acm.hdu.edu.cn/showproblem.php?pid=1230 2017年题目(这个是找的最准确的题目): 1题见【链接】 2题见【链接】

云端筑梦师 2255

Tornado-Redis-Chat 开源项目教程

Tornado-Redis-Chat 开源项目教程 项目介绍 Tornado-Redis-Chat 是一个基于 Tornado 和 Redis 的多房间聊天应用。该项目利用 Tornado 的异步网络框架和 Redis 的 Pub/Sub 功能作为消息队列,实现多进程环境下的消息分发。通过这种方式,可以运行多个应用实例,支持高并发聊天场景。 项目快速启动 环境准备 安装 Python 3.x 安...

gitblog_01186的博客 971

位置点位到达判断FC(Easy+Codesys+博途平台)

IN rActPositon REAL 轴当前实际位置 1IN arAbsPosition REAL[10] 各工作点位坐标 2IN rDeadZone REAL 位置达到判断域值 范围 3OUT abInAbsPos BOOL[10] 到达各绝对定位点位标志 位置到达输出 4VAR i INT 循环计数 5VAR rErr REAL 位置偏差 6。

RXXW_Dor的博客 536

深入理解 DDR5 Bank Group 与并行调度机制

Bank Group架构和并行调度机制,是DDR5性能跃升的核心秘密!理解它们才能写出高效调度程序,设计出性能强劲又稳定的DDR5系统。🎯记住:Bank Group不是简单的分组,而是高速并行的“魔法钥匙”,巧用它,你的DDR5设计将爆发惊人性能!

weixin_43199439的博客 313

Tornado 实践:简介及初步使用Tornado

1、Tornado 是什么 Tornado 是一个 Python Web 框架和异步网络库,最初由 FriendFeed 开发。 通过使用非阻塞网络 I/O,Tornado 可以扩展到成千上万的开放连接,非常适合长时间轮询,WebSocket 和需要与每个用户建立长期连接的其他应用程序。Tornado 出现的目的在于解决高并发场景下的稳定性和性能问题。Tornado 提供了一个 HttpServer,在 Tornado 6.x 版本中,使用了最新的异步 IO 库,使该服务器的性能大大提高。它使用非阻塞网络

haeasringnar的博客 1283

【主题建模】一种基于深度学习的主题建模方法:BERTopic(实战篇)

BERTopic 是基于深度学习的一种主题建模方法。2018 年底,Devlin et al. 提出了 Bidirectional Encoder Representations from Transformers (BERT)。BERT 是一种用于 NLP 的预训练策略,它成功地利用了句子的深层语义信息。

Data · Model · Agent · Repeat 2万+

把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统

“表达欲”是人类成长史上的强大“源动力”,恩格斯早就直截了当地指出,处在蒙昧时代即低级阶段的人类,“以果实、坚果、根作为食物;音节清晰的语言的产生是这一时期的主要成就”。而在网络时代人们的表达欲往往更容易被满足,因为有聊天软件的存在。通常意义上,聊天大抵都基于两种形式:群聊和单聊。群聊或者群组聊天我们可以理解为聊天室,可以有人数上限,而单聊则可以认为是上限为2个人的特殊聊天室。

刘悦的技术博客 2892

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

视频教程-lucky带你玩转高并发Tornado框架-Python

lucky带你玩转高并发Tornado框架 精通 Python PHP My...

weixin_33662951的博客 233

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Django、Flask与Tornado核心差异与选型指南

Python Web框架是构建后端服务的基础技术栈,其本质差异在于架构哲学与运行模型:Django采用全栈式同步MVT架构,强调约定优于配置;Flask以微内核设计支持插件化扩展,赋予开发者高度控制权;Tornado则基于异步事件循环,专为高并发长连接场景优化。三者在请求处理生命周期、数据持久化方式、错误处理机制及部署模型上存在根本性分野。技术选型不应聚焦语法差异,而需结合业务并发特征、开发迭代效率与团队工程能力综合判断。本文深入对比三框架在真实生产环境中的实现逻辑、性能边界与典型陷阱,覆盖用户注册API的

weixin_30268921的博客 413

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

基于Python Tornado框架的毕业设计:2025年计算机毕业设计选题汇总(建议收藏)✅

基于Python Tornado框架的毕业设计:2025年计算机毕业设计选题汇总(建议收藏)✅基于Python Tornado的100个毕业设计选题,包括技术选型、技术难点、系统框架、创新点、功能说明和开发难度。## 1. 实时在线聊天室 - **技术选型**:Tornado, WebSocket, Redis, MySQL - **技术困难点**:实时通信、消息同步、高并发 - **系统框架**:Tornado + WebSocket + Redis + MySQL - **创新点**:支持多设备同步、消

vxLGY178888的博客 1119

django web app_tornado与vue.js解决web一对一实时聊天(IM)

记录一下这个阶段遇到的一些问题。解决方案: 前端vue.js+ajax 后端django rest framework + tornado 用户鉴权用JWT redis做系统缓存 一.前后端鉴权问题1.django api鉴权django通过鉴定http请求头的Authorization头部,进行鉴权。当收到请求时,主要是以下方面的问题:该token是否真实有效该token所代表的用户是否为唯一登...

weixin_39973410的博客 341

Tornado高并发实战:异步WebSocket实时应用与踩坑指南

在Python后端开发中,高并发和实时通信一直是架构设计的核心挑战。传统的同步Web框架面对大量长连接时,往往受限于线程模型和内存开销,难以支撑海量在线用户。异步非阻塞I/O正是解决这一问题的关键思想:通过事件循环和协程协作,让单个进程也能高效处理数万连接。基于此理念诞生的Tornado框架,原生支持WebSocket长连接,天然适用于IM聊天、行情推送、协同编辑等实时应用场景。它不仅提供了轻量级的并发处理能力,更在资源占用上远优于传统多线程方案。本文从异步原理出发,深入剖析Tornado的事件循环机制、协

weixin_33290540的博客 230

python + redis长轮询

前言说起来长轮询也不是什么新鲜概念,不过个人首次用python实现。环境Mac, Python3.5.2, Tornado4.4.2。http协议在介绍长轮询前先了解下http协议。 http:超文本传输协议,是网络七层模型中的应用层协议,它是基于TCP/IP协议的。在 1,最早的http协议0.9版本,有且仅有一个GET请求。 2,往后就是http1.0,其引入了GET, POST两种请求,

wushirenfei的博客 4557

Tornado框架高并发实战:从原理到百万级连接优化

异步I/O是现代高并发服务的核心技术,通过事件循环机制实现非阻塞处理,显著提升系统吞吐量。Tornado作为Python生态中的高性能异步框架,采用单线程非阻塞模型,内置epoll/kqueue事件循环,特别适合实时通信场景。在WebSocket、长轮询等实时交互业务中,Tornado的QPS可达传统同步框架的6倍以上。通过连接分片管理、协程调度优化和TCP参数调优,能实现单机百万级并发连接。本文结合股票行情推送和物联网平台案例,详解Tornado在事件循环机制、连接管理和生产环境部署方面的工程实践。

weixin_28710999的博客 204
上一篇: Solr4.2.1中文分词
下一篇: Linux线程私有数据
「已注销」
博客等级 码龄16年 1粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值