博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python tornado websocket 多聊天室(返回消息给部分连接者)
阅读量:5022 次
发布时间:2019-06-12

本文共 4531 字,大约阅读时间需要 15 分钟。

python tornado 构建多个聊天室, 多个聊天室之间相互独立, 实现服务器端将消息返回给相应的部分客户端!

chatHome.py    // 服务器端, 渲染主页 --》 聊天室建立websocket连接 --》 服务器端记录连接 --》 服务器端接收消息,判断聊天室,返回最新消息到对应聊天室

1 #-*-coding:utf-8-*-  2 __author__ = 'zhouwang'  3 import json  4 import tornado.web  5 import tornado.websocket  6 import tornado.httpserver  7 import tornado.ioloop  8 import tornado.options  9 from uuid import uuid4 10  11 class ChatHome(object): 12     ''' 13         处理websocket 服务器与客户端交互 14     ''' 15     chatRegister = {} 16  17     def register(self, newer): 18         ''' 19             保存新加入的客户端连接、监听实例,并向聊天室其他成员发送消息! 20         ''' 21         home = str(newer.get_argument('n'))     #获取所在聊天室 22         if home in self.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     def unregister(self, lefter): 34         ''' 35             客户端关闭连接,删除聊天室内对应的客户端连接实例 36         ''' 37         home = str(lefter.get_argument('n')) 38         self.chatRegister[home].remove(lefter) 39         if self.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     def callbackNews(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': message 55         } 56         self.callbackTrigger(home, message) 57  58     def callbackTrigger(self, home, message): 59         ''' 60             消息触发器,将最新消息返回给对应聊天室的所有成员 61         ''' 62         for callbacker in self.chatRegister[home]: 63             callbacker.write_message(json.dumps(message)) 64  65  66 class chatBasicHandler(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 class homeHandler(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 class newChatStatus(tornado.websocket.WebSocketHandler): 85     ''' 86         websocket, 记录客户端连接,删除客户端连接,接收最新消息 87     ''' 88     def open(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 def on_close(self): 94 self.application.chathome.unregister(self) #删除客户端连接 95 96 def on_message(self, message): 97 self.application.chathome.callbackNews(self, message) #处理客户端提交的最新消息 98 99 100 class Application(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()

 

basic.html    //主页, 选择进入聊天室, sessoin 设定为登录用户, GET: n指定聊天室, u指定用户

1 2     

你好 !{
{ session }}
欢迎来到聊天室!

3 聊天室一   聊天室二 4

 

home.html         //聊天室,建立websocket连接,发送消息,接受消息,根据最新消息的发送者处理消息格式并写入页面

1  2  3  4     
5 6 7 42 43 44
45
46

聊天室({
{ n }})!

47
48
49 50
51
52
53 54
55
56
57
58
59
60 61

 

转载于:https://www.cnblogs.com/wowoo1121/p/5806566.html

你可能感兴趣的文章
java基本数据类型转换
查看>>
SpringBoot整合Redis
查看>>
vue 入坑02 解析webpack的编译打包
查看>>
ubuntu12.04 telnet配置
查看>>
sublime安装PackageControl提示失败(被墙了)
查看>>
1、Sql-oracle-日期问题
查看>>
JSTree如何实现第二级菜单异步从数据库读取。
查看>>
[UE4]区分队友
查看>>
安装GRID时跑root.sh脚本报错(ORA-27091: unable to queue I/O)
查看>>
Select算法(最坏复杂度O(n))
查看>>
SFTP的使用
查看>>
Hybris电商方案介绍(企业全渠道) B2B B2C O2O建设
查看>>
删除文件以后,如何通过git撤销删除的文件,不提交到远端代码库
查看>>
three.js加入监控
查看>>
Android 一键加速原理
查看>>
图解Android - Zygote, System Server 启动分析
查看>>
洛谷.3389.[模板]高斯消元法
查看>>
BZOJ.1951.[SDOI2010]古代猪文(费马小定理 Lucas CRT)
查看>>
洛谷.2619.[国家集训队2]Tree I(带权二分 Kruskal)
查看>>
Codeforces.226D.The table(构造)
查看>>