免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2670 | 回复: 8
打印 上一主题 下一主题

如何把《python基础编程》的24章虚拟茶话会改成多房间的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-12 11:48 |只看该作者 |倒序浏览
本帖最后由 python小菜 于 2014-08-12 12:56 编辑

如题!!求各位大牛指导,或者给点思路
  1. #coding:utf-8
  2. from asyncore import dispatcher  
  3. from asynchat import async_chat
  4. import socket
  5. import asyncore

  6. HOST = ''
  7. PORT = 50005
  8. SERVERCONF = (HOST,PORT)
  9. NAME = 'TestChat'

  10. class EndSession(Exception):
  11.     pass  

  12. class CommandHandler(object):
  13.     '''''
  14.     命令解析类
  15.     '''
  16.      
  17.     def unknown(self,session,cmd):
  18.         '响应未知的命令'
  19.         session.push('Unknown command: %s \r\n' %cmd)

  20.     def handle(self,session,line):
  21.         '处理从客户端发来的信息 解析命令和内容'
  22.             
  23.         if not line.strip():  
  24.             print 'get a line :',line  
  25.             return
  26.          
  27.         parts = line.split(' ',1)
  28.         #命令分离  
  29.         cmd = parts[0]
  30.         try:
  31.             line = parts[1].strip()
  32.         except IndexError:
  33.             line = ''
  34.         #调用相应的方法处理命令  
  35.         meth = getattr(self, 'do_'+cmd, None)
  36.         try:
  37.             #调用命令对应的方法  
  38.             meth(session,line)
  39.         except TypeError:
  40.             self.unknown(session, cmd)
  41.             
  42. class Room(CommandHandler):
  43.     '''''
  44.     包括一个或多个用户(会话)的泛型环境。负责处理基本的命令和广播
  45.     '''
  46.      
  47.     def __init__(self,server):
  48.         self.server = server
  49.         self.sessions = []
  50.          
  51.     def add(self, session):
  52.         'add a user'
  53.         self.sessions.append(session)
  54.          
  55.     def remove(self,session):
  56.         'a user leave'
  57.         self.sessions.remove(session)
  58.          
  59.     def broadcast(self,line):
  60.         'give all session in the room a line'
  61.         for session in self.sessions:
  62.             session.push(line)
  63.          
  64.     def do_logout(self,session,line):
  65.         '响应登出命令'
  66.         raise EndSession
  67.      
  68. class LoginRoom(Room):
  69.     '''''
  70.     为刚刚登陆的用户准备的房间
  71.     '''
  72.      
  73.     def add(self,session):
  74.         Room.add(self, session)
  75.         self.broadcast('Welcome to %s \r\n' %self.server.name)
  76.          
  77.     def unknown(self, session, cmd):
  78.         session.push('Please login \nUse "login <nick>"\r\n')
  79.          
  80.     def do_login(self, session, line):
  81.         name = line.strip()
  82.         #登陆时必须指定一个用户名  
  83.         if not name:
  84.             session.push('Please enter a name\r\n')
  85.         elif name in self.server.users: #用户名不可重复 ?  
  86.             session.push('The name "%s" is taken! \r\n' %name)
  87.             session.push('Please try again.\r\n')
  88.         else:
  89.             session.name = name
  90.             session.enter(self.server.main_room)
  91.             
  92. class ChatRoom(Room):
  93.     '''''
  94.     为多用户在一起聊天准备的房间
  95.     '''
  96.     def add(self, session):
  97.         #tell all new one come  
  98.         self.broadcast(session.name +' has entered the room. \r\n')
  99.         self.server.users[session.name] = session
  100.         Room.add(self, session)
  101.          
  102.     def remove(self, session):
  103.         Room.remove(self. session)
  104.         #tell all the user logout  
  105.         self.broadcast(session.name +' has left the room \r\n')
  106.          
  107.     def do_say(self, session, line):
  108.         self.broadcast(session.name+': '+line+'\r\n')
  109.          
  110.     def do_look(self, session, line):
  111.         'look who is in the room'
  112.         session.push('The following are in this room: \r\n')
  113.         for other in self.sessions:
  114.             session.push(other.name+'\r\n')
  115.             
  116.     def do_who(self, session, line):
  117.         '查看谁登陆过'
  118.         session.push('The following are logged in: \r\n')
  119.         for name in self.server.users:
  120.             session.push(name+ '\r\n')

  121. class LogoutRoom(Room):
  122.     '''''
  123.     为单个用户准备的房间,只用于将用户从服务器移除
  124.     '''
  125.      
  126.     def add(self, session):
  127.         try:
  128.             del self.server.users[session.name]
  129.         except KeyError:
  130.             pass  
  131.          
  132. class ChatSession(async_chat):
  133.     '''''
  134.     单个会话,负责和用户通信
  135.     '''
  136.      
  137.     def __init__(self, server, sock):
  138.         async_chat.__init__(self, sock)
  139.         self.server = server
  140.         self.set_terminator('\r\n')
  141.         self.data = []
  142.         self.name = None
  143.         #所有会话从这里登入  
  144.         self.enter(LoginRoom(server))

  145.     def enter(self, room):
  146.         try:  
  147.             cur = self.room
  148.         except AttributeError:
  149.             pass  
  150.         self.room = room  
  151.         room.add(self)
  152.          
  153.     def collect_incoming_data(self, data):
  154.         self.data.append(data)
  155.          
  156.     def found_terminator(self):
  157.         line = ''.join(self.data)
  158.         self.data = []
  159.         try:
  160.             self.room.handle(self, line)
  161.         except EndSession:
  162.             self.handle_close()
  163.          
  164.     def handle_close(self):
  165.         async_chat.handle_close(self)
  166.         self.enter(LogoutRoom(self.server))
  167.          
  168. class ChatServer(dispatcher):
  169.     '''''
  170.     只有一个房间的聊天服务器
  171.     '''
  172.      
  173.     def __init__(self, serverconf, name):
  174.         dispatcher.__init__(self)
  175.         self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
  176.         self.set_reuse_addr() #可以重用上一次的端口号  
  177.         self.bind(SERVERCONF)
  178.         self.listen(5)
  179.         self.name = name  
  180.         self.users = {}
  181.         self.main_room = ChatRoom(self)
  182.      
  183.     def handle_accept(self):
  184.         conn, addr = self.accept()
  185.         ChatSession(self, conn)

  186. #主函数        
  187. if __name__=='__main__':
  188.     s = ChatServer(SERVERCONF,NAME)
  189.     try:
  190.         asyncore.loop()
  191.     except KeyboardInterrupt:
  192.         print 'server Exception ...quit'
复制代码

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
2 [报告]
发表于 2014-08-12 12:47 |只看该作者
同学,你至少把题目抄过来呗,那本书不是谁都有,而且谁有功夫帮你翻书?

论坛徽章:
0
3 [报告]
发表于 2014-08-12 12:57 |只看该作者
回复 2# ssfjhh

不好意思。。。代码已经贴上去啦!
   

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
4 [报告]
发表于 2014-08-12 13:57 |只看该作者
回复 3# python小菜


    同学,给你跪了。

论坛徽章:
0
5 [报告]
发表于 2014-08-12 14:33 |只看该作者
。。。难道还有问题!!这个程序只是一个房间的聊天,现在想改成多房间聊天,不知道如何下手回复 4# ssfjhh


   

论坛徽章:
0
6 [报告]
发表于 2014-08-13 12:31 |只看该作者
大牛快出现啊~不要沉了

论坛徽章:
5
巨蟹座
日期:2014-08-28 18:12:342015年迎新春徽章
日期:2015-03-04 10:01:4415-16赛季CBA联赛之江苏
日期:2016-04-28 09:43:3115-16赛季CBA联赛之吉林
日期:2016-06-22 10:34:4315-16赛季CBA联赛之山西
日期:2016-08-16 16:29:55
7 [报告]
发表于 2014-08-14 14:46 |只看该作者
多房间聊天? 没明白

论坛徽章:
0
8 [报告]
发表于 2014-08-15 18:52 |只看该作者
源程序就是只能在一个房间里面聊天,而我想把它改成多个房间,就是新来的用户可以选择创建一个房间,或者加入其他存在的房间!回复 7# Linux_manne


   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
9 [报告]
发表于 2014-08-16 11:49 |只看该作者
在不同房间里面聊天?
一个房聊 不好?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP