1 #-*-coding:utf-8-*-
2 __author__ = 'zhouwang'
3 importjson4 importtornado.web5 importtornado.websocket6 importtornado.httpserver7 importtornado.ioloop8 importtornado.options9 from uuid importuuid410
11 classChatHome(object):12 '''
13 处理websocket 服务器与客户端交互14 '''
15 chatRegister ={}16
17 defregister(self, newer):18 '''
19 保存新加入的客户端连接、监听实例,并向聊天室其他成员发送消息!20 '''
21 home = str(newer.get_argument('n')) #获取所在聊天室
22 if home inself.chatRegister:23 self.chatRegister[home].append(newer)24 else:25 self.chatRegister[home] =[newer]26
27 message ={28 'from': 'sys',29 'message': '%s 加入聊天室(%s)' % (str(newer.get_argument('u')), home)30 }31 self.callbackTrigger(home, message)32
33 defunregister(self, lefter):34 '''
35 客户端关闭连接,删除聊天室内对应的客户端连接实例36 '''
37 home = str(lefter.get_argument('n'))38 self.chatRegister[home].remove(lefter)39 ifself.chatRegister[home]:40 message ={41 'from': 'sys',42 'message': '%s 离开聊天室(%s)' % (str(lefter.get_argument('u')), home)43 }44 self.callbackTrigger(home, message)45
46 defcallbackNews(self, sender, message):47 '''
48 处理客户端提交的消息,发送给对应聊天室内所有的客户端49 '''
50 home = str(sender.get_argument('n'))51 user = str(sender.get_argument('u'))52 message ={53 'from': user,54 'message': message55 }56 self.callbackTrigger(home, message)57
58 defcallbackTrigger(self, home, message):59 '''
60 消息触发器,将最新消息返回给对应聊天室的所有成员61 '''
62 for callbacker inself.chatRegister[home]:63 callbacker.write_message(json.dumps(message))64
65
66 classchatBasicHandler(tornado.web.RequestHandler):67 '''
68 主页, 选择进入聊天室69 '''
70 def get(self, *args, **kwargs):71 session = uuid4() #生成随机标识码,代替用户登录
72 self.render('chat/basic.html', session =session)73
74 classhomeHandler(tornado.web.RequestHandler):75 '''
76 聊天室, 获取主页选择聊天室跳转的get信息渲染页面77 '''
78 def get(self, *args, **kwargs):79 n = self.get_argument('n') #聊天室
80 u = self.get_argument('u') #用户
81 self.render('chat/home.html', n=n, u=u)82
83
84 classnewChatStatus(tornado.websocket.WebSocketHandler):85 '''
86 websocket, 记录客户端连接,删除客户端连接,接收最新消息87 '''
88 defopen(self):89 n = str(self.get_argument('n'))90 self.write_message(json.dumps({'from':'sys', 'message':'欢迎来到 聊天室(%s)' % n})) #向新加入用户发送首次消息
91 self.application.chathome.register(self) #记录客户端连接
92
93 defon_close(self):94 self.application.chathome.unregister(self) #删除客户端连接
95
96 defon_message(self, message):97 self.application.chathome.callbackNews(self, message) #处理客户端提交的最新消息
98
99
100 classApplication(tornado.web.Application):101 def __init__(self):102 self.chathome =ChatHome()103
104 handlers =[105 (r'/', chatBasicHandler),106 (r'/home/', homeHandler),107 (r'/newChatStatus/', newChatStatus),108 ]109
110 settings ={111 'template_path': 'html',112 'static_path': 'static'
113 }114
115 tornado.web.Application.__init__(self, handlers, **settings)116
117 if __name__ == '__main__':118 tornado.options.parse_command_line()119 server =tornado.httpserver.HTTPServer(Application())120 server.listen(8000)121 tornado.ioloop.IOLoop.instance().start()