全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本人是个python初学者,选择的入门书籍是python基础教程第二版,因为看网上说这本书最后有十个项目非常好,所以就选择了这本书。但是没想到其中的项目5:虚拟茶话会可是让我郁闷了好久,因为照着打出来的代码居然有那么多奇怪的错误(其实代码本身没什么错误,应该还是自己打错了)。上网去查,看到有不少人都遇到了这个问题,但是我没找到一个解决的。所以我就写下了这篇经验贴,希望可以帮助和我遇到一样问题的朋友。不多说,直接上代码:# -coding: utf-8 -from asyncore import dispatcherfrom asynchat import async_chatimport socket, asyncorePORT = 5000NAME = Sasu&Salyclass EndSession(Exception): passclass CommandHandler:类似于标准库中的cmd。Cmd的简单命令处理程序。def unknown(self, session, cmd):相应未知命令session.push(Unknown command: %srn % cmd)def handle(self, session, line):处理从给定会话中接收到的行if not line.strip(): return 分离命令parts = line.split( , 1)cmd = parts0try: line = parts1.strip()except IndexError: line = 试着查找处理程序meth = getattr(self, do_ + cmd, None)try:假定它是可调用的meth(session, line)except TypeError:如果不可以被调用,此段代码响应未知的命令self.unknown(session, cmd)class Room(CommandHandler):包括一个或多个用户的泛型环境。它负责基本的命令处理和广播。def _init_(self, server):self.server = serverself.sessions = def add(self, session):一个用户已经加入房间self.sessions.append(session)def remove(self, session):一个用户已经离开房间self.sessions.remove(session)def broadcast(self, line):向房间中的所有会话发送一行for session in self.sessions:session.push(line)def do_logout(self, session, line):响应logout命令raise EndSessionclass LoginRoom(Room):为刚刚连接上的用户准备的房间def add(self, session):当用户进入时,发出问候Room.add(self, session)self.broadcast(Welcome to %srn % )def unknown(self, session, line):所有未知命令会导致一个警告session.push(Please log innUse loginrn)def do_login(self, session, line):name = line.strip()if not name:session.push(Please enter a namern)elif name in self.server.users:session.push(The name %s is taken.rn % name)session.push(Please try again.rn)else: = namesession.enter(self.server.main_room)class ChatRoom(Room):为多用户相互聊天准备的房间def add(self, session):告诉所有人有新用户进入self.broadcast( + has entered the room.rn) = sessionRoom.add(self, session)def remove(self, session):Room.remove(self, session)告诉所有人有用户离开self.broadcast( + has left the room.rn)def do_say(self, session, line):self.broadcast(+:+line+rn)def do_look(self, session, line):处理look命令,该命令用于查看谁在房间内session.push(The following are in this room:rn)for other in self.sessions:session.push( + rn)def do_who(self, session, line):处理who命令,该命令用于查看谁登录了session.push(The following are logged in:rn)for name in self.server.users:session.push(name + rn)class LogoutRoom(Room):为单用户准备的房间。只用于将用户名从服务器移除def remove(self, session):try: del except KeyError: passclass ChatSession(async_chat):单会话,负责和单用户通信def _init_(self, server, sock):async_chat._init_(self, sock)self.server = serverself.set_terminator(rn)self.data = = Noneself.enter(LoginRoom(server)def enter(self, room):从当前房间移出自身(self),并且将自身添加到下一个房间try: cur = self.roomexcept AttributeError: passelse: cur.remove(self)self.room = roomroom.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):只有一个房间的聊天服务器def _init_(self, port, name):dispatcher._init_(self)self.create_socket(socket.AF_INET, socket.SOCK_STREAM)self.set_reuse_addr()self.bind(,port)self.listen(5) = nameself.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这次代码我依然是照着书写的,不过不同的是我是边学一个类边写一个类,并且写一点就测试一点,所以最后写完时错误就很少了。但是!还是有错误,还是那种很奇怪的错误。当时指示的是CommandHandler的handle函数有错,但还没说哪行错了,我就一直看一直看,最后觉得parts = line.split( ,1)这句不对劲,不知道split的参数对不对,就去查了手册,最后发现它的第一个参数 其实是一个空格!我当时中间没有空格!这个函数的功能是分割字符串,也就是我们程序中的命令,那个空格代表按空格分隔!把这块改过来后,程序就能正确运行了。 还有一个问题,要注意python的版本!我最一开始是用python3做的,有错误。python3和2好像有较多的改动,这个程序最好在python2运行。其实作者的代码是没有错的,我写这个贴的目的是因为我发现网上有很多
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 患者安全十大目标-2023版理论考核试题
- 教育学题库完整版包含答案
- 《分数除以整数》的教学反思
- 2025 年大学继续教育(继续教育管理)试题及答案
- 文学概论试题及答案「2025年」
- 机械行业职业健康安全试题
- 模拟服刑人员考试题及答案
- 厂房电线火灾应急预案(3篇)
- 2025年监理工程师工作总结范本(2篇)
- 浅析我国非政府组织在社会救助中的角色
- 2025年配电运维工面试常见问题及答案解析
- 美丽河湖评定管理办法
- 2025年神经病学神经系统疾病诊断案例分析试卷答案及解析
- 红色电影影视鉴赏课件
- 第21课《人民英雄永垂不朽》课件统编版语文八年级上册
- (2025年标准)店铺代持协议书
- 2025年食品销售食品安全管理员试题(附答案)
- 肝胆外科中医饮食护理
- DB3401∕T 288-2023 园林设计规范
- 医院计划管理办法试行
- 地铁培训课件模板
评论
0/150
提交评论