聊天室系统v1

上传人:子 文档编号:47107715 上传时间:2018-06-29 格式:PDF 页数:8 大小:179.14KB
返回 下载 相关 举报
聊天室系统v1_第1页
第1页 / 共8页
聊天室系统v1_第2页
第2页 / 共8页
聊天室系统v1_第3页
第3页 / 共8页
聊天室系统v1_第4页
第4页 / 共8页
聊天室系统v1_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《聊天室系统v1》由会员分享,可在线阅读,更多相关《聊天室系统v1(8页珍藏版)》请在金锄头文库上搜索。

1、聊天室系统 v1.0 开发文档 罗恒希 聊天室系统 v1.0 聊天室系统 v1.0 聊天室系统 v1.0 开发文档 罗恒希 一、 系统需求 一、 系统需求 1、 系统能允许尽量多的用户登陆进入该系统(此处所谓“尽量多”是指受硬件系统的 性能限制) 。 2、 用户能够从任何一台装有该系统客户端的终端上登陆该系统。 3、 系统作为一个开放的聊天环境,应该允许任何有聊天愿望的人进入该系统,并让其 在该系统上畅所欲言。除非该聊天者在聊天室中发表的言论对国家、他人造成了危 害,该系统不能禁止用户登陆。 4、 系统中任何人都能看到其他人的发言。 5、 每一个聊天者都有一个自己喜欢的称呼,以便区分不同的聊天

2、者。 6、 不能重名登陆 二、 需求分析 二、 需求分析 根据以上描述,可将系统需求用下面的用例框图表示出来。 启动系统添加禁止登陆列表将用户踢出聊天室图21查看聊天信息用户列出在线用户名字查看在线用户详情系统管理员发送消息系统分为服务器和客户端 服务器端 1、接受客户端的连接,接收聊天者发送的聊天信息,转发聊天信息。 2、生成在线用户的列表。 3、查看聊天室中的发言,允许系统管理员发送广播。 4、如果聊天者违反聊天室规定,可断开其连接。 5、允许系统管理员添加禁止登陆的IP列表。 客户端 1、显示在线聊天者列表。 2、发送聊天消息,并将自己的发言显示在聊天信息栏中。 3、显示聊天信息。 三、

3、 系统设计 三、 系统设计 经过需求分析可得出聊天者聊天的顺序图,如下图: 聊天室系统 v1.0 开发文档 罗恒希 聊天者 : 用户系统欢迎界面 : Splash登陆界面 : 登陆窗口服务器发送消息界面 : 消息发送框聊天信息显示界面 : 聊天信息显示框1: 启动客户端2: 系统初始化4: 输入用户名、服务器IP3: 提示输入用户名、服务器IP5: 连接8: 成功连接9: 进入聊天室10: 输入聊天信息11: 发送6: 失败7: 错误消息图3112: 广播客户端欢迎界面 作为系统的 LOGO,界面一定要做得简洁、美观。 应包括:系统名称、作者、能够突出主题的图片。 客户端登陆界面 组成元素:服

4、务器 IP 地址、用于聊天的称呼、一个登陆按钮、一个退出系统 按钮。 聊天界面 组成元素:在线用户列表、聊天信息显示框、聊天信息输入框、发送按钮、退 出按钮、帮助提示信息、一个日期显示器。 客户端 I/O 模型 由于客户端与服务器有多对一的关系, 因而客户端可采用比较简单的多线程锁 定模式,即用一个线程在接收数据,另一个线程来发送数据。 聊天协议客户端 客户端最初与服务器建立稳定连接后, 便发送一个包括聊天者名字的数据, 以 便在聊天室中显示。 管理员对系统管理的顺序图,如下图: 聊天室系统 v1.0 开发文档 罗恒希 管理员 : 系统管 理员服务器启动界 面 : Splash系统任务栏 图标

5、右键菜单聊天信息监 视器禁止登陆列 表:界面在线用户列 表:界面客户连接禁止登陆链 表图321: 启动2: 显示4: 显示6: 显示8: 选中聊天信息监视器菜单项7: 查看聊天信息9: 查看在线用户10: 选中在线用户列表菜单项15: 添加禁止登陆IP17: 选中添加禁用IP菜单项18: 添加11: 踢出在线用户12: 断开3: 双击5: 右击13: 添加禁用IP14: 是在线用户16: 断开19: 是在线用户20: 断开服务器欢迎界面 作为系统的 LOGO,界面一定要做得简洁、美观。 应包括:系统名称、作者、能够突出主题的图片。 服务器主界面 系统启动后,将在任务栏中显示一个系统图标,这就是

6、服务端的操作主界面。 右键菜单 提供系统管理的操作菜单,通过该菜单服务器端可以实现一下功能: 查看在线用户 监视聊天信息 添加禁止登陆 IP 聊天信息查看器 提供系统管理员查看在线信息的界面, 在此操作界面中, 管理员可以向所有在 线用户发送系统消息,便于管理。 查看在线用户信息界面 列出在线用户的信息,包括: 用户名 用户 IP 地址 登陆时间 聊天室系统 v1.0 开发文档 罗恒希 在该操作界面中, 系统管理员可以将在线用户踢出聊天室, 以及将在线用户的 IP 地址添加进禁用 IP 列表中,然后断开与其的连接。 添加禁用 IP 界面 在该界面中,系统管理员可以将要禁止的 IP 地址添加到一

7、个配置文件中,当 系统启动时读入配置文件禁止该 IP 登陆。 如果具有该 IP 的用户在线, 则断开 其连接。 对界面的操作要求 每个操作对话框只能有一个实例对象。并且都是 Modeless 的,这样便于系统 管理员操作。 服务实体的 I/O 模型 由于完成端口模型的优良特性, 因此服务器端采用该模型。 将服务器实体的代 码封装到一个类 ChatServer 中,在服务器启动时就创建其对应的对象,然后 利用该对象来接收客户端的连接, 对连接的管理, 发送和接收消息以及与操作 界面进行交互。 对完成端口 I/O 模型的原理分析 首 先 , 工 作 者 线 程 是 负 责 监 控 完 成 端 口

8、工 作 情 况 , 它 利 用 函 数 GetQueuedCompletionStatus()让线程处于一种警戒状态,如果完成端口完成 指定的操作,该线程就会继续执行下去。 其次, 工作者线程创建的多少是根据服务器中 CPU 的数量来计算的通常为每个 CPU 创建两个工作者线程。 再次, 完成端口是系统管理的一个线程, 用 CreateIoCompletionPort 来创建, 在函数中通过将套接字和一个完成端口绑定来实现对该套接字上事件的响应。 最后, 当一个工作者线程从 GetQueuedCompletionStatus 这个 API 调用中接收 到 I/O 完成通知后,在 lpCompl

9、etionKey 和 lpOverlapped 参数中,会包含一 些必要的套接字信息。利用这些信息,可通过完成端口,继续在一个套接字上 进行 I/O 处理。 四、 系统实现 四、 系统实现 系统界面采用 VC+6.0 MFC 开发 通讯协议采用 TCP 服务器实体与界面的交互 聊天室系统 v1.0 开发文档 罗恒希 上图是服务端模块中几个对象之间的交互,其中省略了对象中的属性和操作。 服务器实体采用消息通讯的机制来通知聊天信息监视器对话框、 在线用户列保 对话框、禁止登陆列表对话框数据更新。 WM_USERIN 表示有用户连入,在监视器上显示一条某某用户连入的系统消息 WM_UPDATEMSG

10、 表示有用户发送消息,更新显示消息 WM_USERQUIT 表示用户正常退出,显示一条某某用户退出的系统消息 对话框采用调用服务器实体对象中的公共接口来完成一下操作 踢出在线用户:LetUserOut() 添加禁止登陆 IP:AddDisableIP()还未实现 服务器类的实现 数据结构说明 /与查看在线用户界面关联的在线用户信息表 struct tagUserList char szUsernameMAX_NAME_SIZE; /用户名 MAX_NAME_SIZE=10 char szIP20; /用户 IP char sztime10; /登陆时间 struct tagUserList *

11、next; /与每个连接相关的接收/发送缓冲区 struct _BUFFER_OBJ char DataBufferDEFAULT_BUFFER_SIZE; /接收/发送缓冲区 LONG sendcount; /该缓冲区被发送的次数 /当接收到一个 SOCKET /上的聊天信息时,需要 /转发给所有在线用户, /在发送之初将其值置为 /m_clientcount(当前在 /线用户数), 当完成发送 /后减 1,当所有用户都 /发送完后将该缓冲区释 /放 /与每个连接相关的客户信息 struct _CLIENT_OBJ WSAOVERLAPPED ol; /用于异步通讯 的重叠数据结构 Char

12、 clientnameMAX_NAME_SIZE; /进入连接后获、 /取的用户名, 以便判断是否有重名, 对重名 /的处理是禁止后连入的重名用户登陆 聊天室系统 v1.0 开发文档 罗恒希 char time10; /记录登陆时间 SOCKET sclient; /客户连接套 /接字 WSABUF RecvDataBuf; /接收 WSABUF WSABUF SendDataBuf; /发送 WSABUF IOType optype; /操作类型 BOOL broadcast; /用于判断完成 /发送的套接字是否是发送它自己消息的套 /接字,以便再次投递 WSARecv() struct s

13、ockaddr_in addressinfo; /连入用户的地 址信息 BUFFER_OBJ *recvbuf; /接收缓冲区 BUFFER_OBJ *sendbuf; /发送缓冲区 BOOL firstrecv; /判断是否是第 /一次收到数据,如果是则是用户名 CRITICAL_SECTION SockCritSec; /临界区变量 struct _CLIENT_OBJ *next; /操作类型枚举结构 enum IOType OP_IORead, /接收操作标志 OP_IOWrite, /发送操作标志 核心代码说明 DWORD WINAPI ChatServer:ServerWorker

14、Thread(LPVOID CompletionPortID) 该函数中的代码是工作者线程运行的代码,是完成端口的核心。我根据 操作类型对完成通讯的 SOCKET 进行处理。对于 OP_IORead 即接收操作, 如果 BytesTransferred0,则说明客户端要关闭连接退出系统,因此应 该关闭该客户的套接字,然后释放客户数据结构。如果不为 0,则判断是 否是第一次接收到数据,如果是则说明收到的是用户名,填写用户信息 表,然后向所有在线用户广播一条欢迎系统消息,并写入聊天信息监视 器。如果不是第一次接收则向所有在线用户转发该用户的消息。对 于 OP_IOWrite 即发送操作,先根据客户

15、连接数据结构中的 sendbuf 结 构中的 sendcount 是否为 0 来判断是不是所有用户都广播完了,如果 是则释放发送缓冲区。然后根据 broadcast 的值来找出发送它自己消息 的客户套接字,找到后将在它上面再投递一个接收命令。 客户端实现 聊天室系统 v1.0 开发文档 罗恒希 当用户在登陆界面上输入登陆信息后,按“登陆”按钮,开始初始化套接字、 连接服务器一系列操作后,如果登陆成功,则发送用户的名字到服务器端,并 创建接收线程,然后显示聊天界面。 当客户端收到消息后就向聊天界面发送 WM_HASMSG 消息, 界面收到消息后刷新 界面。 当客户端要发送消息的时候,直接调用发送函数。 未实现对于显示在线用户列表,目前 1.0 版本中还未实现。 五、 未完成的功能 五、 未完成的功能 添加禁止登陆用户 IP 客户端用户列表

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号