一、主要知识点
- asyncore作为服务器端的主要用法
- async_chat模块的使用
- pySimpleGUI界面框
- telnetlib作为客户端socket模块
二、如何设计一个聊天室的应用?应该考虑哪些方面
- 必要条件:服务器端、多客户端
- 必要约束:数据传输协议—以换行符作为消息的分隔符
- 原理:服务器监听消息来源、客户端连接服务器并发送消息到服务器
三、async_chat模块介绍
他是dispacher这个类的抽象子类,定义了一些专门数据传输方面的方法,非常有利于实现数据传输。
-
主要方法:
-
collect_incoming_data:接收数据
-
found_terminator:当输入数据流符合由set_terminator设置的终止条件时被调用
-
set_terminator:设置终止条件
-
push:向数据传输队列压入要传输的数据
四、聊天室服务器的基本功能
- 接收客户端的连接
- 保存登陆用户信息
- 处理各种传输过来的消息
- 维护客户的聊天状态
五、聊天室的结构设计
-
ChatServer:类似于socket-server角色,它负责接收客户端连接请求并且要创建socket对象,创建好的socket对象要传给ChatSession对象进行保存使用,使得客户端能够持续和服务器端进行通信。
-
ChatSession:保存socket连接对象,负责与客户端进行实际的通信,继承于async_chat这个父类,主要的方法:collect_incoming_data用于数据的存储,定义found_terminator来设置聊天的数据传输规则,以换行符标识每一条信息,handle_close处理用户退出聊天。
-
CommandHandler:用于自定义协议,类似于开发httpserver的时候的协议格式定制处理。在代码中为了方便处理,可以定义方法的预设格式,比如所有的方法都由do_开头,然后在代码中我们可以通过反射的方法来直接调用处理。
-
Room(CommandHandler):主要作用维护存有所有用户的session列表以及广播发送消息处理。二是维护当前用户的聊天状态,聊天状态一般为登录聊天室、登出聊天室以及正在聊天等基本状态,不同的状态做不同的事情,所以需要为Room创建几个不同的子类对应不同的聊天状态。LoginRoom,LoginoutRoom,ChatRoom。
六、PySimpleGUI
-
优势:
-
基于传统的事件驱动
-
简化布局方式,默认采用简单线性网络布局
-
自动处理事件的回调