一个专属聊天软件开发,python码农赚了三千块!
点击上方“程序员大咖”,选择“置顶公众号”关键时刻,第一时间送达!作者:Python新世界链接:https://www.jianshu.com/p/c9bfd93edba...
点击上方“程序员大咖”,选择“置顶公众号”
作者: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 的客户端发送消息,此时,所有的在线用户都可以收到对应的消息。
▼点击「阅读原文」进入程序员商城
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐





所有评论(0)