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:]
回来再写。。
时间: 2024-10-29 11:30:02