[Python-*-读书]Python基础教程--虚拟茶话会

来源:互联网 发布:2017年电信诈骗数据 编辑:程序博客网 时间:2024/05/10 20:14

总的来说是一个只支持一个聊天室的服务器端 客户端使用telnet

书籍下载地址:Python资料汇总

Python教程  这里是第二十四章的源码,练习研究之用

#coding:utf8 #python2.7 chatSer2.py#稍微复杂一点的聊天室服务器'''用python启动服务 telnet连接之后就可以变成简单的聊天服务器第一次登陆:login name 登出: logout说话: say 查看谁登陆过服务器:who 查看同一个房间的人 : look 简单例子:telnet localhost 50005Welcome to TestChatlogin tianshidiyu has entered the room.nihUnknown command: ihsay nihaotianshi: nihaodiyu: niyehao'''from asyncore import dispatcher from asynchat import async_chatimport socketimport asyncoreHOST = ''PORT = 50005SERVERCONF = (HOST,PORT)NAME = 'TestChat'class EndSession(Exception):    pass class CommandHandler(object):    '''    命令解析类    '''        def unknown(self,session,cmd):        '响应未知的命令'        session.push('Unknown command:%s \r\n' %cmd)    def handle(self,session,line):        '处理从客户端发来的信息 解析命令和内容'        if not line:            print 'please write a command...'                    if not line.strip():             print 'get a line :',line             return                parts = line.split(' ',1)        #命令分离        cmd = parts[0]        try:            line = parts[1].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 = server        self.sessions = []            def add(self, session):        'add a user'        self.sessions.append(session)            def remove(self,session):        'a user leave'        self.sessions.remove(session)            def broadcast(self,line):        'give all session in the room a line'        for session in self.sessions:            session.push(line)            def do_logout(self,session,line):        '响应登出命令'        raise EndSession    class LoginRoom(Room):    '''    为刚刚登陆的用户准备的房间    '''        def add(self,session):        Room.add(self, session)        self.broadcast('Welcome to %s \r\n' %self.server.name)            def unknown(self, session, cmd):        session.push('Please login \nUse "login <nick>"\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)            session.push('Please try again.\r\n')        else:            session.name = name            session.enter(self.server.main_room)            class ChatRoom(Room):    '''    为多用户在一起聊天准备的房间    '''    def add(self, session):        #tell all new one come        self.broadcast(session.name +' has entered the room. \r\n')        self.server.users[session.name] = session        Room.add(self, session)            def remove(self, session):        Room.remove(self. session)        #tell all the user logout        self.broadcast(session.name +' has left the room \r\n')            def do_say(self, session, line):        self.broadcast(session.name+': '+line+'\r\n')            def do_look(self, session, line):        'look who is in the room'        session.push('The following are in this room: \r\n')        for other in self.sessions:            session.push(other.name+'\r\n')                def do_who(self, session, line):        '查看谁登陆过'        session.push('The following are logged in: \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):    '''    单个会话,负责和用户通信    '''        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         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):    '''    只有一个房间的聊天服务器    '''        def __init__(self, serverconf, name):        dispatcher.__init__(self)        self.create_socket(socket.AF_INET,socket.SOCK_STREAM)        self.set_reuse_addr() #可以重用上一次的端口号        self.bind(SERVERCONF)        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(SERVERCONF,NAME)    try:        asyncore.loop()    except KeyboardInterrupt:        print 'server Exception ...quit'                                     

结果如图所示






原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 室友在寝室养猫怎么办 和直接领导不合怎么办 房产共有人去世怎么办 发现邪教宣传内容怎么办 说课时两个课时怎么办 投稿文章被拒绝怎么办 中立性细胞偏低怎么办? 孩子爱告状老师怎么办 高中学不好数学怎么办 想做老师应该怎么办 教师职称换学校怎么办 大四差选修学分怎么办 尔雅通识课学分没修满怎么办 大学全英文授课怎么办 小孩脑部有囊肿怎么办 防震期间门应该怎么办 在家待着没意思怎么办 人户分离上学怎么办 小孩上学没人接送怎么办 宝宝上学没人接送怎么办 上海浦东新区酒类许可证怎么办 金税盘里报税处理打不开怎么办 惠民卡到期了怎么办 遇到不拴狗链的主人怎么办 平安福没钱续保怎么办 提前很久到机场怎么办 机场来早了怎么办 机场去早了怎么办 只有高中学历该怎么办 没钱没学历该怎么办 中招分数压线怎么办 两岁宝宝蛀牙怎么办 大学必修课差一分怎么办 好医生差两分怎么办 万丽酒店怎么办会员 银行放款慢 业主怎么办 错过了毕业申请怎么办 初中生字写不好怎么办 对口升学没考上怎么办 天生喝不了酒怎么办 王者荣耀乱举报怎么办