点击上方“程序员大咖”,选择“置顶公众号”
作者:Python新世界
链接:https://www.jianshu.com/p/c9bfd93edbab
程序员大咖整理发布,转载请联系作者获得授权
一、实验介绍
1.1 实验内容
本实验使用 wxPython 、asynchat、_thread 等模块开发一个图形界面的聊天室程序。
1.2知识点
asyncore、asynchat模块使用
wxPython图形开发
1.3实验环境
python3.5
对于实验环境中使用的wxPython,在环境中我们已经给出了对应的安装包。
二、原理解析
录聊天室,并与其他成员进行聊天。
由于 Python 是一门带 GIL 的语言,所以在 Python 中使用多线程处理IO操作过多的任务并不是很好的选择。同时聊天服务器将同多个 socket 进行通信,所以我们可以基于 asyncore 模块实现聊天服务器。aysncore 模块是一个异步的 socket 处理器,通过使用该模块将大大简化异步编程的难度。asynchat 模块在 asyncore 模块的基础上做了进一步封装,简化了基于文本协议的通信任务的开发难度。
既然要开发聊天程序,那必然需要设计聊天时使用的协议。为了简单起见,我们将要开发的聊天服务器只支持文本协议,通过command message 的方式调用相关的操作。比如如果客户端发送以下文本,将执行相应的操作
以上协议流中,login, say, look, logout 就是相关协议代码。
然后使用下面的命令在/home/ shiyanlou/code目录下创建我们需要的
server.py和client.py 文件:
三、服务器类
这里我们首先需要一个聊天服务器类,通过继承asyncore的dispatcher类来实现,我们编写server.py文件:
这里需要补充说明的是,对于asyncore 和asynchat模块来讲,在python3.6中,使用asyncio模块代替,但是实验环境中我们使用的是python 3.5,也由于wxPython 对于Linux下CPython 的支持,所以我们依然使用python 3.5。
3.1 会话类
有了服务器类还需要能维护每个用户的连接会话,这里继承asynchat的async_ chat 类来实现,在server.py文件中定义,代码如下
3.2 协议命令解释器
在之前的分析中,我们设计了聊天服务器的协议,我们需要实现协议命令的相应方法,具体来说就是处理用户登录,退出,发消息,查询在线用户的代码。在server.py 文件中定义,
3.3 房间
接下来就需要实现聊天室的房间了,这里我们定义了三种房间,分别是用户刚登录时的房间、聊天的房间和退出登录的房间,这三种房间都继承自CommandHandler,在server.py 文件中定义,代码如下:
四、登陆窗口
完成了服务器端后,就需要实现客户端了。客户端将基于 wxPython 模块实现。 wxPython 模块是 wxWidgets GUI 工具的 Python 绑定。所以通过 wxPython 模块我们就可以实现 GUI 编程了。同时我们的聊天协议基于文本,所以我们和服务器之间的通信将基于 telnetlib 模块实现。
登录窗口通过继承 wx.Frame 类来实现,编写 client.py 文件,代码如下:
4.1 聊天窗口
聊天窗口中最主要的就是向服务器发消息并接受服务器的消息,这里通过子线程来接收消息,在client.py文件中定义,代码如下:
五、执行
首先,我们执行 server.py ,如下图所示:
这时,我们再打开一个终端,执行 client.py 文件,如下图:
输入对应的信息之后,点击Login ,再次重复上一步骤,使用另一-用户名shiyanlou002登陆,如下图:
在最终的示例中,我们可以分别通过shiyanlou001 和shiyanlou0e2 的客户端发送消息,此时,所有的在线用户都可以收到对应的消息。
▼点击「阅读原文」进入程序员商城