典型网络数据库系统软件设计
作者:∑阿强
下载源代码
一、概述
- 本系统为内部系统,帐户由管理员添加、管理;
- 分为两个组,User组和Boss组。Boss组的帐户可以发广播通知;
- 任意两个用户间可以互相通信;
- 数据库接口用DAO,网络通信用 CSocket+CSocketFile;
二、详细设计
1、数据库设计
本系统只是一个消息通信模型,这里的数据库设计比较简单。
ER图:
User (No , Name ,Password ,G#) 候选键:No 外键:G#Group (G# , GroupName ,Demo ) 主键 :G#
2、消息格式设计
<1>、传送的消息共有5类------登录消息,验证返回消息,普通消息,用户列表消息,通知消息。定义一个枚举类型:
enum MSGTYPE {LOGIN , LOGINResponse , CHATTING , USERList , NOTICE};
<2>、定义消息类
class CMsg : public CObject {public: int m_eType; //枚举类型,记录消息类型 CString m_strMsg; //消息 CMsg(); virtual ~CMsg(); void Serialize(CArchive &ar); //消息类系列化函数,发送和接受消息时用。}; <3>、m_strMsg 为消息类中存放消息的成员,它的具体格式随着消息类型m_eType不同而不同。m_eType
m_strMsg
LOGIN
呢称|密码
LOGINResponse
GOOD|欢迎!(BOSS) 或 FAILED|验证失败!
CHATTING
发给(来自)的用户名|消息内容
USERList
呢称1|呢称2|…|呢称n|END
NOTICE
ALL|消息内容 或 来自的用户|消息内容
m_strMsg中个内容用“|”隔开,用函数Decode(int n,CString strMsg) 获的相应的内容。
CString Decode(int n,CString strMsg){ int pos; CString str; for(int i=1;i<=n;i++) { pos=strMsg.Find ("|",0); if(pos<0) str=strMsg; else str=strMsg.Left (pos); strMsg=strMsg.Right(strMsg.GetLength ()-pos-1); } return str;} <4>、消息发送接收的序列化函数void CMsg::Serialize (CArchive &ar){ if(ar.IsStoring()) { ar<<m_strMsg<<m_eType; } else { ar>>m_strMsg>>m_eType; }} 3、通信协议设计
- 验证。客户端发送LOGIN消息,服务器回应 LOGINResponse消息;
- 通信。客户端发送CHATTING 或 NOTICE 消息,服务器端根据接收到的消息,发送CHATTING,NOTICE或 USERList 消息。
4、服务器设计
<1>、建立工程
- ①、用MFC AppWizard(exe) 新建一个“单个文档”的工程;
- ②、在Step 2 of 6中,选 “查看数据库不使用文件支持”,点击“Data Source..”按钮,然后在弹出的对话框中选 “DAO”类型,再浏览选择数据库文件Data.mdb. 按确定,再在弹出的窗口选User表;
- ③、点击Next到Step 4 of 6,选“windows Sockets”。网络功能支持;
- ④、按“NEXT“,最后点击 “完成”;
int m_iPort;//服务器端口 CSocketListen * m_pSocket; //监听套接字。 CSocketClient m_SocketClient[Max]; //跟客户端通信的套接字。 CArchive * m_pArOut; //发送消息时的序列化文档对象指针。 CArchive * m_pArIn; //接收消息时的序列化化文档对象指针。 CSocketFile * m_pSF; //套接字文件对象指针。 CMsg msg;//消息类对象 CString Decode(int n,CString strMsg); //消息的解码函数 void SendUserList(); bool CheckLogin(CSocketClient *pClient); void MyReceive(CSocketClient *pClient); void MyClose(CSocketClient *pClient); void MyAccept();上一页 下一页






