Tornado 实现实时消息聊天,tornado实时,关键代码之 Messag


关键代码之 MessageServer

#!/usr/bin/env python# -*- coding:utf-8 -*-import uuidunique_id = lambda: str(uuid.uuid1())class MessageServer(object):    """消息服务器    @param id: 服务器标识, 默认为 UUID    """    servers = {}    def __init__(self, id=None):        self.id = id or unique_id()        self.observers = []        self.messages = []        self.__class__.servers[id] = self    def listen(self, success_callback):        self.observers.append(success_callback)        return success_callback    def add_message(self, message, id=None):        id = id or unique_id()        try:            self.messages.append((id,message))            [callback(id, message) for callback in self.observers]        finally:            self.observers = []

异步 Controller

#!/usr/bin/env python# -*- coding:utf-8 -*-import webimport messageimport jsonmsgsrv = message.MessageServer()json_encode = json.JSONEncoder().encodeclass ChatMessageController(web.Controller):    @web.asynchronous    def get(self):        @msgsrv.listen        def observer(id, msg):            update_msg = json_encode({'id':id,'msg':msg})            try:                self.finish(update_msg)            except IOError:                pass    def post(self):        name = unicode(self.get_argument("username")).strip()        content = unicode(self.get_argument("content")).strip()        msgsrv.add_message("%s: %s" % (name,content))

评论关闭