Tornado是一个异步Python框架,最初由FriendFeed发起并开源,目前由Facebook维护,非常适合实时做Web应用。
Redis是一个NoSQL数据库,常用于做缓存系统,这里主要用到了它的Pub/Sub功能。即当一个用户发送一条消息时,所有的用户都会收到消息。
关于什么是Ajax长轮询(Comet)不再介绍
我是参照the5fire的一篇博客来组织项目源码的:http://www.the5fire.com/tornado-mvc-helloworld-2.html
当Tornado收到浏览器的消息时,将这条消息publish到Redis里,所有的subscriber就都会收到通知。
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();
将Tornado超时时间设置为60s,如果在60s内,收到了Redis的消息,就把消息发送给浏览器;如果60s超时了,则发送一条msg为空的消息给浏览器。
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');
浏览器JavaScript代码如下,每当服务器返回结果以后,就立即再发送一个请求到服务器。因为空闲的时候,服务器要等60s才会有响应,所以这并不会消耗很多资源。
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();
全部代码参见我的git:https://github.com/wylazy/tornado-chat
分享到:
相关推荐
7. **连接池**:为避免频繁创建和销毁连接,Tornado-Redis通常会使用连接池,有效管理资源,提高系统效率。 **使用Tornado-Redis** 在实际开发中,使用Tornado-Redis通常涉及以下步骤: 1. **安装**:首先,通过...
资源分类:Python库 所属语言:Python 资源全名:tornado-redis-session-0.1.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
NULL 博文链接:https://edisonlz.iteye.com/blog/1679114
龙卷风重演基于Redis的服务器端会话中间件安装pip install tornado-redis-session用法 from tornado . httpserver import HTTPServerfrom tornado . ioloop import IOLoopfrom tornado . web import authenticated ,...
综上所述,这个项目结合了Vue3.0的前端能力、Tornado6.1的WebSocket支持和Redis的发布订阅模式,构建了一个高效的实时聊天系统。Vue3.0处理用户界面和状态管理,Tornado6.1作为实时通信服务器,而Redis则作为后台的...
这个版本的 Tornado 是针对网站开发的一个框架,它提供了丰富的功能来帮助开发者构建实时的、长连接的应用程序,如聊天服务、实时博客或者协作工具等。其主要特性包括: 1. **非阻塞I/O**: Tornado 使用了 Python ...
【标题】:“qt聊天室tornado服务器”是一个项目,它结合了Tornado Web服务器与Qt图形用户界面(GUI)框架,构建了一个实时的在线聊天应用。这个应用允许用户通过网络进行交互,提供了一种基本的即时通讯功能。 ...
标题“WebSocket聊天室”指的是一个使用WebSocket技术构建的在线聊天应用程序。这种聊天室允许用户即时发送和接收消息,无需不断地刷新页面。这得益于WebSocket的特性,即一旦连接建立,就可以在两端之间持续地发送...
在“WebSocket简易聊天室”项目中,我们主要关注以下几个核心知识点: 1. **WebSocket协议**:WebSocket协议定义了一种在单个TCP连接上进行全双工通信的协议。它构建在TCP协议之上,通过HTTP/1.1的Upgrade机制来...
龙卷风-重新聊天更多信息怎么跑 cd tornado-redis-chatdocker build -t chat .docker run --name some-redis -d redisdocker run --name some-app -p 8888:8888 --link some-redis:redis -d chat然后您可以转到 (对...
总之,Python开发者可以通过Redis和ZMQ在各自的环境中实现异步的发布订阅功能,结合Tornado这样的Web框架,可以构建出高性能、低延迟的分布式系统。理解并掌握这些工具的使用,对于提升Python开发能力,特别是处理大...
在全民编程的大环境下,学习编程的人与日俱增,而为开发者提供问答的社区也逐渐流行起来。例如,国外最著名技术问答社区 ...本章主要使用 Python中的轻量级异步框架 Tornado来实现一个类似 Stackoverflow的问答社区网站。
Tornado的`tornado.web`模块提供了构建Web应用的基本元素,如RequestHandler、Application和URL调度。你可以通过定义RequestHandler类来处理HTTP请求,并在其中定义`get`、`post`等方法。通过Application实例化,将...
Tornado是一个轻量级且高性能的Web服务器和异步网络库,它非常适合构建实时、长连接的Web应用,如聊天室。 【描述】: 该项目的核心是利用Python的Tornado框架来实现后端服务,同时配合前端HTML、CSS和JavaScript...
一个基于Tornado/mongodb/redis的社区系统。特点 简单:去除传统社区中多数不常用到的功能,保留精华。(这里向 http://zone.wooyun.org 学习) 高效: mongodb:数据库设计合理,以空间换取时间,尽量减少数据库...
**Python-基于Python的博客使用Tornado和Bootstrap框架开发螺壳网** 在现代Web开发中,Python语言以其简洁明了的语法和强大的库支持而受到欢迎。本项目以Python为基础,利用Tornado Web服务器框架和Bootstrap前端...
这个集成包包含三个支撑包,分别是`python-dateutil-1.5`,`redis-py-master`,和`tornado-master`。 1. **python-dateutil-1.5**: `python-dateutil` 是一个用于处理日期和时间的Python库,它扩展了Python标准库...
1. 构建:在项目中添加源文件后,可以使用Tornado的构建工具进行编译和链接。构建过程可以是自动化的,也可以手动触发。 2. 调试:Tornado提供了强大的调试器,支持断点、单步执行、变量查看、内存检查等功能。通过...
在Python和Tornado中,可以使用如RabbitMQ、Kafka或Redis等消息队列作为中介,将任务发布到队列中,然后由分布在不同机器上的工作进程消费。这些工作进程可以是运行相同Tornado应用的实例,它们从队列中获取任务,...
该服务不仅构建在Tornado Web服务器之上,还采用了React.js作为前端开发框架,确保了系统的高性能和良好的用户体验。 1. Redis基础 Redis是一个开源的、基于内存的数据结构存储系统,常被用作数据库、缓存和消息...