VC网络数据库开发培训讲学_第1页
VC网络数据库开发培训讲学_第2页
VC网络数据库开发培训讲学_第3页
VC网络数据库开发培训讲学_第4页
VC网络数据库开发培训讲学_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC网络数据库开发VC网络数据库开发(2006-6-3016:10:00)【收藏】【评论】【打印】【关闭】标签:vc典型网络数据库系统软件设计一、概述本系统为内部系统,帐户由管理员添加、管理;分为两个组,User组和Boss组。Boss组的帐户可以发广播通知;任意两个用户间可以互相通信;数据库接口用DAO,网络通信用CSocket+CSocketFile;二、详细设计1、数据库设计本系统只是一个消息通信模型,这里的数据库设计比较简单ER图把ER模型转为关系模型,共两个表:User(No,Name,Password,G#)候选键:No外键:G#Group(G#,GroupName,Demo)主键:G#2、消息格式设计<1>、传送的消息共有5类 登录消息,验证返回消息,普通消息,用户列表消息,通知消息。定义一个枚举类型:enumMSGTYPE(LOGIN,LOGINResponse,CHATTING,USERList,NOTICE);<2>、定义消息类classCMsg:publicCObject(public:intm_eType; 〃枚举类型,记录消息类型CStringm_strMsg; //消息CMsg();virtual~CMsg();voidSerialize(CArchive&ar);〃消息类系列化函数,发送和接受消息时用。};<3>、m_strMsg为消息类中存放消息的成员,它的具体格式随着消息类型m_eType不同而不同。maTvnamc+rMcgLOGIN 呢称|密码LOGINResponse GOODl欢迎!(BOSS)或FAILEDl验证失败!CHATTING 发给(来自)的用户名|消息内容USERList 呢称11呢称2l・・・l呢称nlENDNOTICE ALLl消息内容或来自的用户l消息内容 m_strMsg中个内容用“|”隔开,用函数Decode(intn,CStringstrMsg)获的相应的内容。CStringDecode(intn,CStringstrMsg)(intpos;CStringstr;for(inti=1;i<=n;i++)(pos二strMsg.Find(〃|〃,0);if(pos<0)str二strMsg;elsestr二strMsg.Left(pos);strMsg二strMsg.Right(strMsg.GetLength()-pos-1);}returnstr;}<4>、消息发送接收的序列化函数voidCMsg::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>、建立工程①、用MFCAppWizard(exe)新建一个“单个文档”的工程;②、在Step2of6中,选“查看数据库不使用文件支持”,点击“DataSource..”按钮,然后在弹出的对话框中选“DAO”类型,再浏览选择数据库文件Data.mdb.按确定,再在弹出的窗口选User表;③、点击Next到Step4of6,选"windowsSockets”。网络功能支持;④、按“NEXT",最后点击“完成”;<2〉、在CSuperServerView中添加下列成员:intm_iPort;//服务器端口CSocketListen*m_pSocket; //监听套接字。CSocketClientm_SocketClient[Max]; //跟客户端通信的套接字。CArchive*m_pArOut;〃发送消息时的序列化文档对象指针。CArchive*m_pArIn; 〃接收消息时的序列化化文档对象指针。CSocketFile*m_pSF; //套接字文件对象指针。CMsgmsg;//消息类对象CStringDecode(intn,CStringstrMsg);//消息的解码函数voidSendUserList();boolCheckLogin(CSocketClient*pClient);voidMyReceive(CSocketClient*pClient);voidMyClose(CSocketClient*pClient);voidMyAccept();<3〉、CSuperServerView类的关键成员函数:voidCSuperServerView::MyReceive(CSocketClient*pClient)(m_pSF=newCSocketFile(pClient);m_pArIn=newCArchive(m_pSF,CArchive::load);msg.Serialize(*m_pArIn);inti;boolbOK=false;switch(msg.m_eType)(caseLOGIN: 〃处理用户登录。(m_pSF=newCSocketFile(pClient);m_pArOut二newCArchive(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;}caseCHATTING: //处理普通消息(for(i=0;i<Max;i++)(if(m_SocketClient[i].m_bBusy)(if(m_SocketClient[i].m_strName==Decode(1,msg.m_strMsg))(m_pSF=newCSocketFile(&m_SocketClient[i]);m_pArOut二newCArchive(m_pSF,CArchive::store);msg.m_strMsg二pClient->m_strName+〃|〃+Decode(2,msg.m_strMsg);msg.Serialize(*m_pArOut);m_pArOut->Flush();break;}}}break;caseNOTICE: //处理广播消息。(msg.m_strMsg二pClient->m_strName+〃|〃+Decode(2,msg.m_strMsg);for(i=0;i<Max;i++)(if(m_SocketClient[i].m_bBusy&&m_SocketClient[i].m_strName!=pClient->m_strName)(m_pSF=newCSocketFile(&m_SocketClient[i]);m_pArOut二newCArchive(m_pSF,CArchive::store);msg.Serialize(*m_pArOut);m_pArOut->Flush();}}break;}}}voidCSuperServerView::MyAccept()(for(inti=0;i<Max;i++)(if(!m_SocketClient[i].m_bBusy)(m_pSocket->Accept(m_SocketClient[i]);m_SocketClient[i].GetView(this);break;}}}voidCSuperServerView::OnStartServer() //开始服务(m_pSocket二newCSocketListen(this);m_pSocket->Create(m_iPort,SOCK_STREAM);m_pSocket->Listen();m_staState.SetWindowText("正在监听 ");}if(m_pSocket)m_pSocket->Close();for(inti=0;i<Max;i++)(if(m_SocketClient[i].m_bBusy)(m_SocketClient[i].Close();m_SocketClient[i].m_bBusy二false;}}m_staState.SetWindowText("服务关闭”);}数据库维护操作函数:voidCSuperServerView::OnButtonAdd()//添加帐户(CAddDlgdlg;if(dlg.DoModal()==IDOK)(if(dlg.m_strName!二〃〃)(m_pSet->AddNew();m_pSet->m_Name=dlg.m_strName;m_pSet->m_Password=dlg.m_strPwd;m_pSet->m_G_=dlg.m_iG;m_pSet->Update();UpdateData(FALSE);}}}voidCSuperServerView::OnButtonDel() //删除帐户(m_pSet->Delete();m_pSet->MoveNext();if(m_pSet->IsEOF())m_pSet->MoveFirst();UpdateData(FALSE);}voidCSuperServerView::OnButtonModify()//修改帐户信息(CAddDlgdlg;dlg.m_strName=m_pSet->m_Name;dlg.m_strPwd=m_pSet->m_Password;dlg.m_iG=m_pSet->m_G_;if(dlg.DoModal()==IDOK)(if(dlg.m_strName!二〃〃)(m_pSet->Edit();m_pSet->m_Name=dlg.m_strName;m_pSet->m_Password=dlg.m_strPwd;m_pSet->m_G_=dlg.m_iG;m_pSet->Update();UpdateData(FALSE);}}}voidCSuperServerView::OnButtonFind()//查找帐户(CFindDLGdlg;if(dlg.DoModal()==IDOK)(if(dlg.m_strKey!="")(CStringm_strName;UpdateData(TRUE);m_strName=dlg.m_strKey;if(m_pSet->IsOpen())m_pSet->Close();m_pSet->Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT*FROMuserwhereName=''〃+m_strName+〃’’〃);UpdateData(FALSE);}}}CSocketListen类中的接受事件函数OnAccept(intnErrorCode)。voidCSocketListen::OnAccept(intnErrorCode)(m_pView->MyAccept();CSocket::OnAccept(nErrorCode);CSocketClient类中的接收消息函数。voidCSocketClient::OnClose(intnErrorCode)(//TODO:Addyourspecializedcodehereand/orcallthebaseclassm_pView->MyClose(this);CSocket::OnClose(nErrorCode);}CSocketClient类传递主窗口指针函数:voidCSocketClient::GetView(CSuperServerView*pView)(m_pView=pView;}<4>、程序界面5、客户端设计。<1>、建立一个名为Client,基与对话框的应用程序,在Step2of6中选WindowsSockts支持,<2>、在CClientDlg中添加成员。CStringDecode(intn,CStringstrMsg);CMsgmsg;CMySocket*m_pSocket;CArchive*m_pArOut;CArchive*m_pArIn;CSocketFile*m_pSF;voidMyReceive();在CMySocket类中添加成员。CClientDlg*m_pDlg;CMySocket(CClientDlg*pDlg);构造函数实现,获得指向主对话框的指针CMySocket::CMySocket(CClientDlg*pDlg)(m_pDlg=pDlg;}<3>、关键函数BOOLCClientDlg::OnInitDialog()(・・・m_strHost=〃192.168.1.126”;m_iPort=1234;UpdateData(FALSE);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(false);Expand(0);returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCClientDlg::OnLogin()〃登录函数(UpdateData(TRUE);GetDlgItem(IDC_BUTTON1)->SetWindowText(〃Wait〃);m_pSocket=newCMySocket(this);m_pSocket->Create();intnTry=3,n;do(n=m_pSocket->Connect(m_strHost,m_iPort);}while(n!=1&&nTry--);if(n==1)(Sleep(2000);m_pSF=newCSocketFile(m_pSocket);m_pArOut二newCArchive(m_pSF,CArchive::store);m_pArIn二newCArchive(m_pSF,CArchive::load);msg.m_eType=LOGIN;msg.m_strMsg=m_strName+"|"+m_strPwd;msg.Serialize(*m_pArOut);m_pArOut->Flush();}else(GetDlgItem(IDC_BUTTON1)->SetWindowText("Login");GetDlgItem(IDC_BUTTON1)->EnableWindow(true);AfxMessageBox("网络原因,没连上服务器!");}}voidCClientDlg::MyReceive()//接收消息函数(msg.Serialize(*m_pArIn);inti=0;CStringstr;switch(msg.m_eType)(caseLOGINResponse:str二Decode(1,msg.m_strMsg);if(str=="FAILED")(str二Decode(2,msg.m_strMsg);m_pSocket->Close();AfxMessageBox(str);}else(Expand(true);GetDlgItem(IDC_BUTTON1)->SetWindowText("Login");GetDlgItem

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论