局域网聊天系统__1.需求分析以及模型选择
来源:互联网 发布:哪个淘宝搜词软件好 编辑:程序博客网 时间:2024/06/10 02:54
一。需求分析
该局域网简易聊天系统主要分服务器和客户端两个部分。客户端交于用户进行聊天,服务器用户管理所有用户的信息。
客户端功能:
1.和其他在线用户进行正常聊天
2.更新用户状态:当有用户上线或下线时,及时更新该用户状态
3.更新用户列表:当其他用户新上线获得被服务器删除时,及时更新用户列表
4.发送离线消息:用户能向其他不在线的用户发送离线消息
5.接收离线消息:用户在上线时,能够收到其他用户发来的离线消息
6.持久化聊天记录:将用户聊天记录保存到文件 下次启动聊天自动加载
服务器功能:
1.查看当前用户列表:能够查看用户详细信息 包括IP 密码 上下线时间等
2.维护当前用户列表:能够删除离线用户以及强制某在线用户下线
3.验证用户登录: 当用户登录时,进行必要的验证(密码验证,重复登录验证等)
4.保存离线消息: 替离线用户保存由在线用户发来的离线消息
5.转发离线消息: 当离线用户上线时,转发为其保存的离线消息
6.通知客户端更新成员列表:当有新用户注册或者被删除时,通知客户端更新列表
7.通知客户端更新成员状态:当有用户上下线时,通知所有客户端更新该用户状态
8.持久化必要数据:在服务器退出时,保存当前暂存的离线消息和用户列表 下次启动自动加载
二. 界面预览
服务器
客户端界面
登录界面 用户界面 离线消息
聊天界面
在线聊天 离线聊天
其他界面
三。通信模型选择
这里选择WSAAsyncSelect模型,通过CSocket类完成客户端和服务器以及客户端和客户端之间的通信
关于CSocket的实现原理这里就不再累述了。对于使用者实际使用来说,CSocket基本特点简要如下:
1.根据功能作用(监听套接字,通信套接字),派生CSocket得到自己想要的类
2.根据该CSocket派生类所感兴趣的消息覆盖CSocket对应的虚函数(如OnAccept OnReceive OnSend OnClose等)
3.在对应的覆盖函数中,做出对应操作
这里有必要说一下CSocketFile类,该类通过序列化操作使得基于CSocket的通信变得异常简便。本实例也通过CSocketFile完成通信。每一个CSocket类或其派生类都应该有一个CSocketFile与其相关联来完成序列化通信。为一个CSocket类关联一个CSocketFile对象可通过在构造CSocketFile对象时传入该CSocket类的指针来实现 比如在CSocket类构造后调用 m_pSocketFile = new CSocketFile(this);
在关联了CSocketFile对象并且保存了其指针后,之后可以通过以下方式实现发送数据
CArchive* pArchiveOut = new CArchive(m_pSocketFile, CArchive::store);
//发送消息
chatpacket.Serialize(*pArchiveOut);
pArchiveOut->Flush();
delete pArchiveOut;
pArchiveOut = NULL;
chatpacket即为通信包 该包需要是一个能够实现序列化的类。通过序列化操作将数据写入m_pSocketFile指向的文件流,而该文件流关联于CSocket类,从而将数据写到了对应的发送缓冲区。同理接收文件也简化为:
CArchive* pArchiveIn = new CArchive(m_pSocketFile, CArchive::load);
delete pArchiveOut;
pArchiveOut = NULL;
//调用监听套接字接受连接请求 并关联到客户端对象
SOCKADDR_IN clientAddr;
int len = sizeof(SOCKADDR_IN);
m_pListenSocket->Accept(*pClient, (SOCKADDR*)&clientAddr, &len);
//写入数据到文件流
chatpacket.Serialize(*pArchiveIn);
delete pArchiveOut;
pArchiveOut = NULL;
对于OnAccept,在接受连接请求时,其参数需要一个CSocket类对象:
CClientSocket* pClient = new CClientSocket();
//调用监听套接字接受连接请求 并关联到客户端对象
SOCKADDR_IN clientAddr;
int len = sizeof(SOCKADDR_IN);
m_pListenSocket->Accept(*pClient, (SOCKADDR*)&clientAddr, &len);
在发送和接收数据时,需要注意:
这些只是初步使用CSocket机制的必要知识,如果要将其用到多线程或者更复杂的环境,将会面临种种难点,这些都需要我们更加深入地理解CSocket的内部实现,结合Win32 Socket编程知识,在理解上加深巩固。咳,当然,我肯定是还不会这些的。-.-
源代码下载地址点击这里:http://download.csdn.net/detail/wudaijun/4911762
- 局域网聊天系统__1.需求分析以及模型选择
- 局域网聊天系统__2.服务器业务逻辑分析
- Cocos2d-x 手游聊天系统需求分析
- [原创]java局域网聊天系统
- 局域网聊天系统详细设计
- 基于局域网的聊天系统
- 局域网聊天|权限管理系统设计思路
- 基于C++的局域网聊天系统客户
- 局域网聊天系统__3.服务器框架实现
- 局域网聊天系统__4.服务器调试篇
- 局域网聊天系统__6.客户端框架实现
- 基于局域网的聊天系统-文档
- java写的TCP局域网聊天系统
- Android:基于局域网的聊天系统
- java版局域网聊天系统(即时通讯)
- C++汇编实现分析__1
- 局域网聊天
- 局域网聊天
- MYSQL自动编号和字段数值唯一性
- poj 1789
- 5使用XmlDocument将dropdownlist中显示的书名的其它信息读入到相应的文本框中。
- logback for HTTP-access log functionality
- 万事开头难
- 局域网聊天系统__1.需求分析以及模型选择
- TextView属性大全
- c, c++ const的区别
- Android组件详解
- Android培训---终止和重启Activity
- TWaver 为电信运营支撑系统(OSS)的开发提供“一站式”的组件产品和解决方案,是快速设计、开发和部署OSS的利器
- 学完C语言做了一个简单的“管理系统”!
- library修改后必须重新烧些fw,否则不起作用
- 【收藏】php实现二维数组排序