本文实例讲述了Python实现基于C/S架构的聊天室功能。分享给大家供大家参考,具体如下:
一、课程介绍
1。简介
本次项目课是实现简单聊天室程序的服务器端和客户端。
2。知识点
服务器端涉及到<代码> asyncore 代码>,<代码> asynchat 代码>和<代码>套接字代码>这几个模块,客户端用到了<代码> telnetlib 代码>,<代码> 代码>,<代码>时间> 代码和线程<代码> 代码>这几个模块。
3。所需环境
本次课中编写客户端需要用到<代码> wxPython> 代码,它是一个GUI工具包,请先使用下面的命令安装:
$ sudo apt-get python-wxtools安装 >之前密码为shiyanlou
4。项目效果截图
登录窗口
聊天窗口
5。源代码下载
git克隆https://github.com/shiyanlou/pythonchat.git
说明:如果你不理解上述代码的下载方式或者下载后在环境中找不到代码,可以点击查看这里
二、项目实战(服务器端)
1。服务器类
首先需要一个聊天服务器,这里继承asyncore的分派器类来实现,代码如下
类ChatServer(调度程序): ”“” 聊天服务器 ”“” def __init__(自我、港口): dispatcher.__init__(自我) self.create_socket(套接字。AF_INET socket.SOCK_STREAM) self.set_reuse_addr () 自我。绑定(端口)(“) self.listen (5) 自我。用户={} 自我。main_room=聊天室(自我) def handle_accept(自我): 康涅狄格州,addr=self.accept () 康涅狄格州ChatSession(自我) >之前2。会话类
有了服务器类还需要能维护每个用户的连接会话,这里继承asynchat的async_chat类来实现,代码如下:
类ChatSession (async_chat): ”“” 负责和单用户通信 ”“” def __init__(自我、服务器、袜子): async_chat。__init__(自我,袜子) 自我。服务器=服务器 self.set_terminator (“\ n”) 自我。data=https://www.yisu.com/zixun/[] self.name=没有 self.enter (LoginRoom(服务器) def输入(自我,房间):“从当前房间移除自身,然后添加到指定房间的 试一试: 坏蛋=self.room 除了AttributeError: 通过 其他: cur.remove(自我) 自我。房间=room.add(自我) def collect_incoming_data(自我、数据): “接受客户端的数据的 self.data.append(数据) def found_terminator(自我): “当客户端的一条数据结束时的处理的 行=" . join (self.data) 自我。data=https://www.yisu.com/zixun/[] 试一试: self.room。处理(自我,线) 除了EndSession: self.handle_close () def handle_close(自我): async_chat.handle_close(自我) self.enter (LogoutRoom (self.server)) >之前3。命令解释器
现在就需要一个命令解释器能够解释用户的命令,例如登录,查询在线用户和发消息等,代码如下:
类CommandHandler: ”“” 命令处理类 ”“” def未知(自我,会话,cmd): “响应未知命令” 会话。push(未知的命令:%年代\ n % cmd) def处理(自我、会话、线): “命令处理的 如果不是line.strip (): 返回 部分=线。分割(' ',1) cmd=[0]部分 试一试: 行=[1]部分.strip () 除了IndexError: 行=" 冰毒=getattr(自我,do_ + cmd,无) 试一试: 甲安菲他明(会话,线) 除了TypeError: 自我。未知(会话,cmd) >之前4。房间
接下来就需要实现聊天室的房间了,这里我们定义了三种房间,分别是用户刚登录时的房间,聊天的房间和退出登录的房间,这三种房间都有一个公共的父类,代码如下:
教室(CommandHandler): ”“” 包含多个用户的环境,负责基本的命令处理和广播 ”“” def __init__(自我、服务器): 自我。服务器=服务器 自我。会话=[] def添加(自我、会话): “一个用户进入房间的 self.sessions.append(会话) def删除(自我、会话): “一个用户离开房间的 self.sessions.remove(会话) def广播(自我、线): “向所有的用户发送指定消息的 会话的self.sessions: session.push(线) def do_logout(自我、会话、线): “退出房间的 提高EndSession 类LoginRoom(室): ”“” 刚登录的用户的房间 ”“” def添加(自我、会话): “用户连接成功的回应的 房间。添加(自我,会话) 会话。push(“连接成功”) def do_login(自我、会话、线): “登录命令处理的 name=line.strip () 如果没有名字: 会话。push(用户名空) elif self.server.users名称: 会话。push(“用户名存在”) 其他: session.name=名字 session.enter (self.server.main_room) 类聊天室(室): ”“” 聊天用的房间 ”“” def添加(自我、会话): “广播新用户进入” 会话。push(“登录成功”) self.broadcast (session.name +“已经进入了房间。\ n”) self.server.users [session.name]=会话 房间。添加(自我,会话) def删除(自我、会话): “广播用户离开的 房间。删除(自我,会话) self.broadcast (session.name +“已经离开了房间。\ n”) def do_say(自我、会话、线): “客户端发送消息的 self.broadcast (session.name +‘:’+线+ ' \ n ') def do_look(自我、会话、线): “查看在线用户的 会话。push(“在线用户:\ n”) 对于其他self.sessions: session.push (other.name + ' \ n ') 类LogoutRoom(室): ”“” 用户退出时的房间 ”“” def添加(自我、会话): “从服务器中移除的 试一试: 德尔self.server.users [session.name] 除了KeyError: 通过Python实现基于C/S架构的聊天室功能详解