使用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

从流体力学到深度学习:手把手教你用PINN预测涡流场(基于TensorFlow2.10+GPU)

本文详细介绍了如何利用物理信息神经网络(PINN)结合TensorFlow 2.10和GPU加速,预测Navier-Stokes方程的涡流场。通过核心原理讲解、实战环境配置、网络架构设计及物理约束实现,帮助读者掌握从流体力学到深度学习的跨学科技术应用,特别适合处理复杂流体问题和非定常流动场景。

weixin_29048309的博客 212

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

量子密钥分发(QKD)原理、工程实现与实战部署全解析

密钥分发是信息安全的核心基础,它解决了通信双方如何安全共享秘密密钥的难题。传统方法依赖于数学问题的计算复杂性,而量子密钥分发(QKD)则基于量子力学原理,为密钥分发提供了信息论安全的物理保障。其核心价值在于,利用量子不可克隆定理和测量坍缩原理,使得任何窃听行为都会被合法通信方检测到,从而在理论上实现无条件安全的密钥协商。这项技术特别适用于对安全性要求极高的场景,如金融数据同步、政务专网和电力系统保护。本文聚焦于量子保密通信,深入剖析了以BB84协议为代表的QKD工作原理,并详细拆解了包含单光子探测、偏振编码

weixin_29324401的博客 346

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

深入STM32 USB OTG FS:从官方MSC例程到实战双存储设备移植全记录

本文详细解析了STM32 USB OTG FS在双存储设备开发中的实战应用,从协议栈底层机制到SD卡/SPI Flash同步挂载的实现。通过优化SDIO接口和SPI Flash驱动,结合USB MSC类的关键实现,提供了完整的解决方案和性能优化策略,适合嵌入式开发者参考。

weixin_28366475的博客 369

望获实时Linux与国产芯片协同:打造LinuxCNC数控机床的全栈国产化方案

本文探讨了如何通过望获实时Linux与飞腾、龙芯等国产芯片的深度协同,为LinuxCNC数控机床打造全栈国产化方案。望获实时Linux通过中断隔离等核心技术,提供亚微秒级确定性响应,解决了传统Linux系统实时性不足的痛点,使LinuxCNC得以稳定驱动高精度机床。该方案实现了从硬件、操作系统到应用软件的全栈自主可控,为工业控制领域提供了高性能、可定制的国产化选择。

weixin_29291069的博客 648

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

微信小程序利用Echarts加载中国地图的步骤

微信小程序如何利用Echarts加载地图?可按照如下四个步骤进行。(阅读时间大概3分钟)。

成都都成 5275

Tornado-Redis-Chat 开源项目教程

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

gitblog_01186的博客 971

RWEQ土壤风蚀模型的估算与变化归因分析

本次以介绍RWEQ模型的基本原理及数据需求,再结合案例讲解RWEQ模型中区域地理空间数据库构建的方法和各个参量提取的原理与方法,最后结合典型案例进行综合讲解风蚀模数估算、制图及归因分析。空间分析与制图:提取分析、局部分析、邻域分析、区域分析、插值分析、平滑处理、像元提取、采样与重采样。以某实际应用为案例,掌握RWEQ模型进行当地土壤风蚀量空间分布分析整体流程。地图服务器、在线地图、范围指示器、格网、表格、基础地图服务使用规则介绍。掌握土壤风蚀模型的原理、优势点及因子组成。

2301_77413856的博客 1194

【制作100个Unity游戏之36】用unity从零开始实现类《开心消消乐》的三消类消除解压小游戏

Unity甜品消除游戏开发摘要 本文介绍了使用Unity开发甜品消除游戏的核心实现步骤: 冰块阵列生成 通过GlobalDef定义全局参数(9行7列网格) IceSpawner脚本动态生成网格化冰块阵列 添加Resolution脚本实现多分辨率适配 随机水果生成 创建FruitSpawner作为水果容器 FruitItem脚本管理水果属性(行列索引、类型) 支持动态创建水果精灵并设置位置 关键技术点 使用Instantiate动态生成预制体 通过localPosition精确控制网格布局 分辨率适配算法保持

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1291

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

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

haeasringnar的博客 1283

Unreal Engine开发:多人联机与网络同步_延迟补偿与预测

通过延迟补偿和预测技术,我们可以显著减少网络延迟对多人在线动作游戏的影响,提升玩家的体验。延迟补偿主要在服务器端实现,通过回溯时间点来更准确地处理输入和事件。预测技术主要在客户端实现,通过预先计算玩家的动作结果来减少延迟感。结合这两种技术,可以实现更平滑、更公平的多人游戏体验。

chenlz2007的博客 1191

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

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

刘悦的技术博客 2892

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

weixin_33662951的博客 233

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

weixin_30268921的博客 412

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

基于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的博客 4555

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、付费专栏及课程。

余额充值