Python实现基于C/S架构的聊天室功能详解

  

本文实例讲述了Python实现基于C/S架构的聊天室功能。分享给大家供大家参考,具体如下:

  

一、课程介绍

  

1。简介

  

本次项目课是实现简单聊天室程序的服务器端和客户端。

  

2。知识点

  

服务器端涉及到<代码> asyncore ,<代码> asynchat 和<代码>套接字这几个模块,客户端用到了<代码> telnetlib ,<代码> ,<代码>时间> 这几个模块。

  

3。所需环境

  

本次课中编写客户端需要用到<代码> wxPython>         $ sudo apt-get python-wxtools安装      之前      

密码为shiyanlou

  

4。项目效果截图

  

登录窗口

  

 Python实现基于C/S架构的聊天室功能详解

  

聊天窗口

  

 Python实现基于C/S架构的聊天室功能详解

  

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架构的聊天室功能详解