VC网络数据库开发

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC网络数据库开发(2006-6-30 16:10:00)

【收藏】【评论】【打印】【关闭】

标签:vc

典型网络数据库系统软件设计

一、概述

1.本系统为内部系统,帐户由管理员添加、管理;

2.分为两个组,User组和Boss组。Boss组的帐户可以发广播通知;

3.任意两个用户间可以互相通信;

4.数据库接口用DAO,网络通信用 CSocket+CSocketFile;

二、详细设计

1、数据库设计

本系统只是一个消息通信模型,这里的数据库设计比较简单。

ER图:

把ER模型转为关系模型,共两个表:

User (No , Name ,Password ,G#) 候选键:No 外键:G#

Group (G# , GroupName ,Demo ) 主键:G#

2、消息格式设计

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<

}

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“,最后点击“完成”;

<2>、在CSuperServerView中添加下列成员:

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();

<3>、CSuperServerView类的关键成员函数:

void CSuperServerView::MyReceive(CSocketClient *pClient)

{

m_pSF=new CSocketFile(pClient);

m_pArIn=new CArchive(m_pSF,CArchive::load);

msg.Serialize (*m_pArIn);

int i;

bool bOK=false;

switch(msg.m_eType )

{

case LOGIN: //处理用户登录。

{

m_pSF=new CSocketFile(pClient);

m_pArOut=new CArchive(m_pSF,CArchive::store);

msg.m_eType =LOGINResponse;

if(CheckLogin(pClient))

{

if(!pClient->m_bBoss)

{

msg.m_strMsg="GOOD|欢迎!";

bOK=true;

}

else

{

msg.m_strMsg="GOOD|BOSS";

bOK=true;

}

else

{

msg.m_strMsg="FAILED|验证失败!";

}

msg.Serialize (*m_pArOut);

m_pArOut->Flush ();

if(bOK) SendUserList();

break;

}

case CHATTING: //处理普通消息

{

for(i=0;i

{

if(m_SocketClient[i].m_bBusy)

{

if(m_SocketClient[i].m_strName

==Decode(1,msg.m_strMsg))

{

m_pSF=new CSocketFile(&m_SocketClient[i]);

m_pArOut=new CArchive(m_pSF,CArchive::store);

msg.m_strMsg=pClient->m_strName+"|"+Decode(2,msg.m_strMsg);

msg.Serialize (*m_pArOut);

m_pArOut->Flush ();

相关文档
最新文档