码迷,mamicode.com
首页 > 其他好文 > 详细

Tornado实现一个消息墙。

时间:2015-10-14 18:10:21      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

Tornado对asynchronous http有很好的支持。 所以跟着demo,总结下一个消息墙要怎么做。

 

思路: 首先查了下有两种思路,一种是client pull 一种是server push。 

这里使用的是server pull,技术就是挺流行的comet技术。

comet大概就是说:我客户端发送一个请求到服务器端,然后服务器端启动一个无线循环,将clinet需要的数据放到response中,并继续刷新,直到整个clinet与server的连接断开。 所以他是一个基于长连接的技术。

 

1.第一步 就是要做发送新消息的处理,即一个client发送一个消息后,要广播通知到所有的client

 1 class NewMessage(tornado.web.RequestHandler):
 2     #overwrite post method
 3     def post(self):
 4         #define messages to send
 5         message = {
 6              "id": str(uuid.uuid4()),
 7              "body",self.get_argument("body"),
 8         }
 9         message["html"] =  tornado.escape.to_basestring(
10              self.render_string("message.html",message=message))
11         if self.get_argument("next",None):
12             self.redirect(self.get_arugment("next"))
13         else:
14             self.write(message)
15        #global_message_buffer IS a global var
16  
17         global_message_buffer.new_message([message])

  解释: message[html] 这部分 是将message传入模板,然后返回html代码。

  最关键的是,将这个mesage广播出去。 使用的global_message_buffer. 

global_message_buffer = MessageBuffer()

class MessageBuffe():
    self.__init__(self):
        
        self.waiters = set()
        self.cache = []
        self.cache_size = 10 #define max message cache
    
    self.new_message(self,message):
           #send message to waiters
        
    
        
            for future in self.waiters:
                future.set_result(message)
            #update waiters to empty
            self.waiters = set()
            #update cache
            self.cache.extend(message)
            #check cache size
            if len(self.cache)>self.cache_size:
                self.cache = self.cache[-self.cache_size:]

回来再写。。

 

  

 

Tornado实现一个消息墙。

标签:

原文地址:http://www.cnblogs.com/-Doraemon/p/4878006.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!