这个虚拟聊天室 还是一个简单的服务器搭建的,运行截图大概是这样的

主要代码如下:

  1. '''''
  2. Created on 2012-7-19
  3. @author: mars
  4. '''
  5. from asyncore import dispatcher
  6. from asynchat import async_chat
  7. import socket,asyncore
  8. PORT=5006
  9. NAME='TestChat2'
  10. class EndSession(Exception):pass
  11. class CommandHandler:
  12. def unknown(self,session,cmd):
  13. session.push('unknown command: %s\r\n'%cmd)
  14. def handle(self,session,line):
  15. #del the line from the target chat
  16. if not line.strip(): return
  17. parts=line.split(' ',1)
  18. cmd=parts[0]
  19. try:line=parts[1].strip()
  20. except IndexError: line=''
  21. #try to find the deal programe
  22. meth=getattr(self,'do_'+cmd,None)
  23. try:
  24. meth(session,line)
  25. except TypeError:
  26. self.unknown(session, cmd)
  27. class Room(CommandHandler):
  28. #including more chat responsible boardcast and deal command
  29. def __init__(self,server):
  30. self.server=server
  31. self.sessions=[]
  32. def add(self,session):
  33. # one user into the room
  34. self.sessions.append(session)
  35. def remove(self,session):
  36. # one user out the room
  37. self.sessions.remove(session)
  38. def broadcast(self,line):
  39. # to evrytroom one line
  40. for session in self.sessions:
  41. session.push(line)
  42. def do_logout(self,session,line):
  43. #make the logout command
  44. raise EndSession
  45. class LoginRoom(Room):
  46. #for the user have been connected now to prepare room
  47. def add(self,session):
  48. Room.add(self, session)
  49. #when user come to the room !!!welcome user
  50. self.broadcast("welcome to %s\r\n" % self.server.name)
  51. def unknown(self,session,cmd):
  52. #chul login and loginout can make an advice
  53. session.push('please log in\n Use"login<nick>"\r\n')
  54. def remove(self,session):
  55. Room.remove(self, session)
  56. #Room.remove(self, session)
  57. self.broadcast(session.name+"has out the room.\r\n")
  58. def do_login(self,session,line):
  59. name=line.strip()
  60. if not name:
  61. session.push("please enter a name\r\n")
  62. elif name in self.server.users:
  63. session.push('the name"%s" is taken.\r\n'%name)
  64. else:
  65. session.name=name
  66. #print session.name
  67. #print 'kkk'+name
  68. #session.enter(ChatRoom(self))
  69. session.enter(self.server.main_room)
  70. class ChatRoom(Room):
  71. #multiuser chatroom
  72. def add(self,session):
  73. # tell all user  the newuset comein
  74. self.broadcast(session.name+"has ented the room.\r\n")
  75. self.server.users[session.name]=session
  76. Room.add(self, session)
  77. def do_say(self,session,line):
  78. self.broadcast(session.name+":"+line+'\r\n')
  79. def do_look(self,session,line):
  80. #check who is in the room
  81. session.push('the following in the room:\r\n')
  82. for other in self.sessions:
  83. session.push(other.name+'\r\n')
  84. def do_who(self,session,line):
  85. #to check who is logining
  86. session.push('the floowing is logining:\r\n')
  87. for name in self.server.users:
  88. session.push(name+'\r\n')
  89. class LogoutRoom(Room):
  90. def add(self,session):
  91. try:
  92. del self.server.users[session.name]
  93. except KeyError:pass
  94. class ChatSession(async_chat):
  95. #responsibel sigle user communicate
  96. def __init__(self,server,sock):
  97. async_chat.__init__(self,sock)
  98. self.server=server
  99. self.set_terminator("\r\n")
  100. self.data=[]
  101. self.name=None
  102. self.enter(LoginRoom(server))
  103. def enter(self,room):
  104. try:cur=self.room
  105. except AttributeError:pass
  106. else:cur.remove(self)
  107. self.room=room
  108. room.add(self)
  109. def collect_incoming_data(self,data):
  110. self.data.append(data)
  111. def found_terminator(self):
  112. line=''.join(self.data)
  113. self.data=[]
  114. try:
  115. self.room.handle(self,line)
  116. except EndSession:
  117. self.handle_close()
  118. def handle_close(self):
  119. async_chat.handle_close(self)
  120. self.enter(LogoutRoom(self.server))
  121. class ChatServer(dispatcher):
  122. #only have one room for the chating 's server
  123. def __init__(self,port,name):
  124. dispatcher.__init__(self)
  125. #dispatcher.__init__(self)
  126. self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
  127. self.set_reuse_addr()
  128. self.bind(('',port))
  129. self.listen(5)
  130. self.name=name
  131. self.users={}
  132. self.main_room=ChatRoom(self)
  133. def handle_accept(self):
  134. conn,addr = self.accept()
  135. ChatSession(self,conn)
  136. if __name__=="__main__":
  137. s=ChatServer(PORT,NAME)
  138. try:asyncore.loop()
  139. except KeyboardInterrupt: print

现在我们开始来详细分析其中的代码,说道详细其实也不会细致到每一行代码,毕竟很多跟上一篇文章讲的一样,这里我们主要分析的是这个cmd的基础命令解释,你看最开始的那个截图,你会发现,login用户名为ni,然后输入say 你好,然后就有 ni:你好,而这个方法就是do_say();

  1. class CommandHandler:
  2. def unknown(self,session,cmd):
  3. session.push('unknown command: %s\r\n'%cmd)
  4. def handle(self,session,line):
  5. #del the line from the target chat
  6. if not line.strip(): return
  7. parts=line.split(' ',1)
  8. cmd=parts[0]
  9. try:line=parts[1].strip()
  10. except IndexError: line=''
  11. #try to find the deal programe
  12. meth=getattr(self,'do_'+cmd,None)
  13. try:
  14. meth(session,line)
  15. except TypeError:
  16. self.unknown(session, cmd)

1,这个handle函数的作用:首先 你输入一个行,然后 parts = line.strip("  "   ,1)将行用空格将行断开成为一个个的,然后取里面的第一个也就是cmd = parts[0],就如刚刚的截图所看到的一样say就被取出来作为cmd了。然后 再仔细观察下面的getattr是不是似曾相识,对的 就在第一篇文本标记的时候讲过的,这个其实很好用,前面是“do_”+cmd(而cmd就是你输入的指令)这样的话,就可以完成了!这当然这是基础命令解释。

2,接下来就是Room了,功能很简单,基础类Room继承了CommandHanlder,包括一个或者多个用户会话的环境,主要负责基本命令处理,和广播。LoginRoom继承Room,为刚刚连接上的用户准备的房间,LogoutRoom用于将用户从服务器移除。ChatRoom就是多用户聊天的地方了 ,一旦登陆进去就到这儿了。ChatSession和ChatServer就不多说 在前面一篇文章已经说过了,

转载于:https://blog.51cto.com/brucemars/962319

python之虚拟聊天室服务器详解相关推荐

  1. GTK+实现linux聊天室代码详解-clientr端

    查看原代码请点击此超链接 注意!!此聊天室对红帽无兼容.需在其他linux系统上运行,如"深度". 加油学习! GTK+实现linux聊天室代码详解-server端:GTK+实现l ...

  2. C/C++实现聊天室(详解版)

    文章目录 一.程序演示 二.项目介绍 三.代码详解 服务器 客户端 一.程序演示 虽然最开始是打算写个局域网就好了的,但其实如果你有云服务器,可以向微信.QQ一样与相隔甚远的朋友聊天,只需要将客户端I ...

  3. SignalR 聊天室实例详解(服务器端推送版)

    翻译自:http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room  (在这里可以下载到实例的源码) Asp.Net Si ...

  4. vue php聊天室,实例详解vue组件父子间通信之聊天室

    本文主要为大家详细介绍了vue组件父子间通信之综合练习聊天室制作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家. 组件父子间通信之综合练习 {{msg}} // 创建父组件 Vu ...

  5. pomelo分布式聊天服务器详解

    pomelo分布式聊天服务器详解 2014-01-05 11:43:49|  分类: node |  标签:pomelo  pomelo聊天  nodejs分布式聊天  pomelo分布式  |举报| ...

  6. python机械臂仿真_VTK与Python实现机械臂三维模型可视化详解

    三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...

  7. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  8. python镜像下载包_python包详解

    干货大礼包!21天带你轻松学Python(文末领取更多福利) 点击查看课程视频地址 本课程来自于千锋教育在阿里云开发者社区学习中心上线课程<Python入门2020最新大课>,主讲人姜伟. ...

  9. Python中的select、epoll详解

    Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...

  10. IP地址,子网掩码,默认网关,DNS服务器详解

    IP地址,子网掩码,默认网关,DNS服务器详解 为了更深入的学习TCP/IP协议,最近看了不少有关资料,收集整理记录如下,以备后面的使用和方便各位学习: IP地址,子网掩码,默认网关,DNS服务器是什 ...

最新文章

  1. jstatd - Virtual Machine jstat Daemon
  2. 浅谈 Python 的 with 语句
  3. JMeter专题系列(二)录制脚本
  4. 【iOS开发】添加评分功能
  5. .NET中栈和堆的比较【转自:c#开发园地】
  6. ios 使用webview 查找_iOS开发WKWebView与JS的交互
  7. 中国体声波器件市场趋势报告、技术动态创新及市场预测
  8. 人脸方向学习(七):Face Recognition-CosFace 解读
  9. 游戏开发之运算符重载(C++基础)
  10. springboot mybatis优雅的添加多数据源
  11. 机器人防火墙出击 提升在线业务的安全未来
  12. [AD]-学习笔记-元件库介绍及电阻容模型和IC类器件的创建
  13. 线性代数 (二): 证明 A^T 乘以 A 为半正定矩阵
  14. selenium chromedriver 下载地址
  15. MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(1) SolidWorks模型的导入
  16. linux飞行模式命令,Android 开启飞行模式的几种方式
  17. maven读取不到包,项目名爆红
  18. IN4007和IN4148的作用
  19. Ubuntu——终端多窗口分屏工具Terminator
  20. 软件测试人员分工【管理层必看】

热门文章

  1. paip.系统无法在消息文件中为 Application 找到消息号为 0x2350 的消息文本。服务器存储空间不足,无法处理此命令
  2. paip.声音按键音延迟的解决
  3. paip.js input onclick失灵不起作用无反应的解决.txt
  4. 恒生电子:O45好在哪儿(深度)| 国君计算机李沐华
  5. Rust: Rust 异步入门 (作者洋芋,来自Rust语言中文社区)
  6. 一文读懂:云上用户如何灵活应用定制化网络服务
  7. 瓜子二手车:急招IoT架构师,相当阿里P9
  8. 海量小文件的开源存储方案选型建议
  9. oracle数据库sqlloader,Oracle 的SQL*LOADER
  10. 毕设题目:Matlab无人机飞行作业