python之虚拟聊天室服务器详解
这个虚拟聊天室 还是一个简单的服务器搭建的,运行截图大概是这样的
主要代码如下:
- '''''
- Created on 2012-7-19
- @author: mars
- '''
- from asyncore import dispatcher
- from asynchat import async_chat
- import socket,asyncore
- PORT=5006
- NAME='TestChat2'
- class EndSession(Exception):pass
- class CommandHandler:
- def unknown(self,session,cmd):
- session.push('unknown command: %s\r\n'%cmd)
- def handle(self,session,line):
- #del the line from the target chat
- if not line.strip(): return
- parts=line.split(' ',1)
- cmd=parts[0]
- try:line=parts[1].strip()
- except IndexError: line=''
- #try to find the deal programe
- meth=getattr(self,'do_'+cmd,None)
- try:
- meth(session,line)
- except TypeError:
- self.unknown(session, cmd)
- class Room(CommandHandler):
- #including more chat responsible boardcast and deal command
- def __init__(self,server):
- self.server=server
- self.sessions=[]
- def add(self,session):
- # one user into the room
- self.sessions.append(session)
- def remove(self,session):
- # one user out the room
- self.sessions.remove(session)
- def broadcast(self,line):
- # to evrytroom one line
- for session in self.sessions:
- session.push(line)
- def do_logout(self,session,line):
- #make the logout command
- raise EndSession
- class LoginRoom(Room):
- #for the user have been connected now to prepare room
- def add(self,session):
- Room.add(self, session)
- #when user come to the room !!!welcome user
- self.broadcast("welcome to %s\r\n" % self.server.name)
- def unknown(self,session,cmd):
- #chul login and loginout can make an advice
- session.push('please log in\n Use"login<nick>"\r\n')
- def remove(self,session):
- Room.remove(self, session)
- #Room.remove(self, session)
- self.broadcast(session.name+"has out the room.\r\n")
- def do_login(self,session,line):
- name=line.strip()
- if not name:
- session.push("please enter a name\r\n")
- elif name in self.server.users:
- session.push('the name"%s" is taken.\r\n'%name)
- else:
- session.name=name
- #print session.name
- #print 'kkk'+name
- #session.enter(ChatRoom(self))
- session.enter(self.server.main_room)
- class ChatRoom(Room):
- #multiuser chatroom
- def add(self,session):
- # tell all user the newuset comein
- self.broadcast(session.name+"has ented the room.\r\n")
- self.server.users[session.name]=session
- Room.add(self, session)
- def do_say(self,session,line):
- self.broadcast(session.name+":"+line+'\r\n')
- def do_look(self,session,line):
- #check who is in the room
- session.push('the following in the room:\r\n')
- for other in self.sessions:
- session.push(other.name+'\r\n')
- def do_who(self,session,line):
- #to check who is logining
- session.push('the floowing is logining:\r\n')
- for name in self.server.users:
- session.push(name+'\r\n')
- class LogoutRoom(Room):
- def add(self,session):
- try:
- del self.server.users[session.name]
- except KeyError:pass
- class ChatSession(async_chat):
- #responsibel sigle user communicate
- def __init__(self,server,sock):
- async_chat.__init__(self,sock)
- self.server=server
- self.set_terminator("\r\n")
- self.data=[]
- self.name=None
- self.enter(LoginRoom(server))
- def enter(self,room):
- try:cur=self.room
- except AttributeError:pass
- else:cur.remove(self)
- self.room=room
- room.add(self)
- def collect_incoming_data(self,data):
- self.data.append(data)
- def found_terminator(self):
- line=''.join(self.data)
- self.data=[]
- try:
- self.room.handle(self,line)
- except EndSession:
- self.handle_close()
- def handle_close(self):
- async_chat.handle_close(self)
- self.enter(LogoutRoom(self.server))
- class ChatServer(dispatcher):
- #only have one room for the chating 's server
- def __init__(self,port,name):
- dispatcher.__init__(self)
- #dispatcher.__init__(self)
- self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
- self.set_reuse_addr()
- self.bind(('',port))
- self.listen(5)
- self.name=name
- self.users={}
- self.main_room=ChatRoom(self)
- def handle_accept(self):
- conn,addr = self.accept()
- ChatSession(self,conn)
- if __name__=="__main__":
- s=ChatServer(PORT,NAME)
- try:asyncore.loop()
- except KeyboardInterrupt: print
现在我们开始来详细分析其中的代码,说道详细其实也不会细致到每一行代码,毕竟很多跟上一篇文章讲的一样,这里我们主要分析的是这个cmd的基础命令解释,你看最开始的那个截图,你会发现,login用户名为ni,然后输入say 你好,然后就有 ni:你好,而这个方法就是do_say();
- class CommandHandler:
- def unknown(self,session,cmd):
- session.push('unknown command: %s\r\n'%cmd)
- def handle(self,session,line):
- #del the line from the target chat
- if not line.strip(): return
- parts=line.split(' ',1)
- cmd=parts[0]
- try:line=parts[1].strip()
- except IndexError: line=''
- #try to find the deal programe
- meth=getattr(self,'do_'+cmd,None)
- try:
- meth(session,line)
- except TypeError:
- 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之虚拟聊天室服务器详解相关推荐
- GTK+实现linux聊天室代码详解-clientr端
查看原代码请点击此超链接 注意!!此聊天室对红帽无兼容.需在其他linux系统上运行,如"深度". 加油学习! GTK+实现linux聊天室代码详解-server端:GTK+实现l ...
- C/C++实现聊天室(详解版)
文章目录 一.程序演示 二.项目介绍 三.代码详解 服务器 客户端 一.程序演示 虽然最开始是打算写个局域网就好了的,但其实如果你有云服务器,可以向微信.QQ一样与相隔甚远的朋友聊天,只需要将客户端I ...
- SignalR 聊天室实例详解(服务器端推送版)
翻译自:http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room (在这里可以下载到实例的源码) Asp.Net Si ...
- vue php聊天室,实例详解vue组件父子间通信之聊天室
本文主要为大家详细介绍了vue组件父子间通信之综合练习聊天室制作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家. 组件父子间通信之综合练习 {{msg}} // 创建父组件 Vu ...
- pomelo分布式聊天服务器详解
pomelo分布式聊天服务器详解 2014-01-05 11:43:49| 分类: node | 标签:pomelo pomelo聊天 nodejs分布式聊天 pomelo分布式 |举报| ...
- python机械臂仿真_VTK与Python实现机械臂三维模型可视化详解
三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- python镜像下载包_python包详解
干货大礼包!21天带你轻松学Python(文末领取更多福利) 点击查看课程视频地址 本课程来自于千锋教育在阿里云开发者社区学习中心上线课程<Python入门2020最新大课>,主讲人姜伟. ...
- Python中的select、epoll详解
Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...
- IP地址,子网掩码,默认网关,DNS服务器详解
IP地址,子网掩码,默认网关,DNS服务器详解 为了更深入的学习TCP/IP协议,最近看了不少有关资料,收集整理记录如下,以备后面的使用和方便各位学习: IP地址,子网掩码,默认网关,DNS服务器是什 ...
最新文章
- jstatd - Virtual Machine jstat Daemon
- 浅谈 Python 的 with 语句
- JMeter专题系列(二)录制脚本
- 【iOS开发】添加评分功能
- .NET中栈和堆的比较【转自:c#开发园地】
- ios 使用webview 查找_iOS开发WKWebView与JS的交互
- 中国体声波器件市场趋势报告、技术动态创新及市场预测
- 人脸方向学习(七):Face Recognition-CosFace 解读
- 游戏开发之运算符重载(C++基础)
- springboot mybatis优雅的添加多数据源
- 机器人防火墙出击 提升在线业务的安全未来
- [AD]-学习笔记-元件库介绍及电阻容模型和IC类器件的创建
- 线性代数 (二): 证明 A^T 乘以 A 为半正定矩阵
- selenium chromedriver 下载地址
- MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(1) SolidWorks模型的导入
- linux飞行模式命令,Android 开启飞行模式的几种方式
- maven读取不到包,项目名爆红
- IN4007和IN4148的作用
- Ubuntu——终端多窗口分屏工具Terminator
- 软件测试人员分工【管理层必看】
热门文章
- paip.系统无法在消息文件中为 Application 找到消息号为 0x2350 的消息文本。服务器存储空间不足,无法处理此命令
- paip.声音按键音延迟的解决
- paip.js input onclick失灵不起作用无反应的解决.txt
- 恒生电子:O45好在哪儿(深度)| 国君计算机李沐华
- Rust: Rust 异步入门 (作者洋芋,来自Rust语言中文社区)
- 一文读懂:云上用户如何灵活应用定制化网络服务
- 瓜子二手车:急招IoT架构师,相当阿里P9
- 海量小文件的开源存储方案选型建议
- oracle数据库sqlloader,Oracle 的SQL*LOADER
- 毕设题目:Matlab无人机飞行作业