`
ipjmc
  • 浏览: 707602 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
    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
分享到:
评论

相关推荐

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

    7. **连接池**:为避免频繁创建和销毁连接,Tornado-Redis通常会使用连接池,有效管理资源,提高系统效率。 **使用Tornado-Redis** 在实际开发中,使用Tornado-Redis通常涉及以下步骤: 1. **安装**:首先,通过...

    Python库 | tornado-redis-session-0.1.3.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:tornado-redis-session-0.1.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

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

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

    tornado-redis-session:基于Redis的服务器端会话中间件

    龙卷风重演基于Redis的服务器端会话中间件安装pip install tornado-redis-session用法 from tornado . httpserver import HTTPServerfrom tornado . ioloop import IOLoopfrom tornado . web import authenticated ,...

    把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅模式打造实时通信聊天系统.zip

    综上所述,这个项目结合了Vue3.0的前端能力、Tornado6.1的WebSocket支持和Redis的发布订阅模式,构建了一个高效的实时聊天系统。Vue3.0处理用户界面和状态管理,Tornado6.1作为实时通信服务器,而Redis则作为后台的...

    tornado4.5.3

    这个版本的 Tornado 是针对网站开发的一个框架,它提供了丰富的功能来帮助开发者构建实时的、长连接的应用程序,如聊天服务、实时博客或者协作工具等。其主要特性包括: 1. **非阻塞I/O**: Tornado 使用了 Python ...

    qt聊天室tornado服务器.zip

    【标题】:“qt聊天室tornado服务器”是一个项目,它结合了Tornado Web服务器与Qt图形用户界面(GUI)框架,构建了一个实时的在线聊天应用。这个应用允许用户通过网络进行交互,提供了一种基本的即时通讯功能。 ...

    websocket聊天室,学习websocket的好例子。

    标题“WebSocket聊天室”指的是一个使用WebSocket技术构建的在线聊天应用程序。这种聊天室允许用户即时发送和接收消息,无需不断地刷新页面。这得益于WebSocket的特性,即一旦连接建立,就可以在两端之间持续地发送...

    websocket简易聊天室

    在“WebSocket简易聊天室”项目中,我们主要关注以下几个核心知识点: 1. **WebSocket协议**:WebSocket协议定义了一种在单个TCP连接上进行全双工通信的协议。它构建在TCP协议之上,通过HTTP/1.1的Upgrade机制来...

    tornado-redis-chat:测试任务

    龙卷风-重新聊天更多信息怎么跑 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然后您可以转到 (对...

    async_pubsub:使用 Redis、ZMQ、Tornado 在 Python 中异步发布订阅

    总之,Python开发者可以通过Redis和ZMQ在各自的环境中实现异步的发布订阅功能,结合Tornado这样的Web框架,可以构建出高性能、低延迟的分布式系统。理解并掌握这些工具的使用,对于提升Python开发能力,特别是处理大...

    python项目开发实战_BBS社区-Tornado+Redis+Bootstrap实现_编程案例实例详解课程教程.pdf

    在全民编程的大环境下,学习编程的人与日俱增,而为开发者提供问答的社区也逐渐流行起来。例如,国外最著名技术问答社区 ...本章主要使用 Python中的轻量级异步框架 Tornado来实现一个类似 Stackoverflow的问答社区网站。

    Tornado使用指南(中文版)

    Tornado的`tornado.web`模块提供了构建Web应用的基本元素,如RequestHandler、Application和URL调度。你可以通过定义RequestHandler类来处理HTTP请求,并在其中定义`get`、`post`等方法。通过Application实例化,将...

    登录界面的多人多聊天室

    Tornado是一个轻量级且高性能的Web服务器和异步网络库,它非常适合构建实时、长连接的Web应用,如聊天室。 【描述】: 该项目的核心是利用Python的Tornado框架来实现后端服务,同时配合前端HTML、CSS和JavaScript...

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

    一个基于Tornado/mongodb/redis的社区系统。特点 简单:去除传统社区中多数不常用到的功能,保留精华。(这里向 http://zone.wooyun.org 学习) 高效: mongodb:数据库设计合理,以空间换取时间,尽量减少数据库...

    Python-基于Python的博客使用tornado和bootstrap框架开发螺壳网

    **Python-基于Python的博客使用Tornado和Bootstrap框架开发螺壳网** 在现代Web开发中,Python语言以其简洁明了的语法和强大的库支持而受到欢迎。本项目以Python为基础,利用Tornado Web服务器框架和Bootstrap前端...

    RedisLive 集成包(LIB包含3个支撑包)

    这个集成包包含三个支撑包,分别是`python-dateutil-1.5`,`redis-py-master`,和`tornado-master`。 1. **python-dateutil-1.5**: `python-dateutil` 是一个用于处理日期和时间的Python库,它扩展了Python标准库...

    tornado堆栈使用说明

    1. 构建:在项目中添加源文件后,可以使用Tornado的构建工具进行编译和链接。构建过程可以是自动化的,也可以手动触发。 2. 调试:Tornado提供了强大的调试器,支持断点、单步执行、变量查看、内存检查等功能。通过...

    python基于Tornado实现,系统核心调度,可分布式扩展

    在Python和Tornado中,可以使用如RabbitMQ、Kafka或Redis等消息队列作为中介,将任务发布到队列中,然后由分布在不同机器上的工作进程消费。这些工作进程可以是运行相同Tornado应用的实例,它们从队列中获取任务,...

    kKlassify:基于Redis的文本分级服务.zip

    该服务不仅构建在Tornado Web服务器之上,还采用了React.js作为前端开发框架,确保了系统的高性能和良好的用户体验。 1. Redis基础 Redis是一个开源的、基于内存的数据结构存储系统,常被用作数据库、缓存和消息...

Global site tag (gtag.js) - Google Analytics