版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
VC網(wǎng)絡(luò)數(shù)據(jù)庫(kù)開(kāi)發(fā)VC網(wǎng)絡(luò)數(shù)據(jù)庫(kù)開(kāi)發(fā)(2006-6-3016:10:00)【收藏】【評(píng)論】【打印】【關(guān)閉】標(biāo)簽:vc典型網(wǎng)絡(luò)數(shù)據(jù)庫(kù)系統(tǒng)軟件設(shè)計(jì)一、概述本系統(tǒng)為內(nèi)部系統(tǒng),帳戶由管理員添加、管理;分為兩個(gè)組,User組和Boss組。Boss組的帳戶可以發(fā)廣播通知;任意兩個(gè)用戶間可以互相通信;數(shù)據(jù)庫(kù)接口用DAO,網(wǎng)絡(luò)通信用CSocket+CSocketFile;二、詳細(xì)設(shè)計(jì)1、數(shù)據(jù)庫(kù)設(shè)計(jì)本系統(tǒng)只是一個(gè)消息通信模型,這里的數(shù)據(jù)庫(kù)設(shè)計(jì)比較簡(jiǎn)單ER圖把ER模型轉(zhuǎn)為關(guān)系模型,共兩個(gè)表:User(No,Name,Password,G#)候選鍵:No外鍵:G#Group(G#,GroupName,Demo)主鍵:G#2、消息格式設(shè)計(jì)<1>、傳送的消息共有5類 登錄消息,驗(yàn)證返回消息,普通消息,用戶列表消息,通知消息。定義一個(gè)枚舉類型:enumMSGTYPE(LOGIN,LOGINResponse,CHATTING,USERList,NOTICE);<2>、定義消息類classCMsg:publicCObject(public:intm_eType; 〃枚舉類型,記錄消息類型CStringm_strMsg; //消息CMsg();virtual~CMsg();voidSerialize(CArchive&ar);〃消息類系列化函數(shù),發(fā)送和接受消息時(shí)用。};<3>、m_strMsg為消息類中存放消息的成員,它的具體格式隨著消息類型m_eType不同而不同。maTvnamc+rMcgLOGIN 呢稱|密碼LOGINResponse GOODl歡迎?。˙OSS)或FAILEDl驗(yàn)證失?。HATTING 發(fā)給(來(lái)自)的用戶名|消息內(nèi)容USERList 呢稱11呢稱2l???l呢稱nlENDNOTICE ALLl消息內(nèi)容或來(lái)自的用戶l消息內(nèi)容 m_strMsg中個(gè)內(nèi)容用“|”隔開(kāi),用函數(shù)Decode(intn,CStringstrMsg)獲的相應(yīng)的內(nèi)容。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>、消息發(fā)送接收的序列化函數(shù)voidCMsg::Serialize(CArchive&ar)(if(ar.IsStoring())(ar<<m_strMsg<<m_eType;}else(ar>>m_strMsg>>m_eType;}}3、 通信協(xié)議設(shè)計(jì)驗(yàn)證??蛻舳税l(fā)送LOGIN消息,服務(wù)器回應(yīng)LOGINResponse消息;通信??蛻舳税l(fā)送CHATTING或NOTICE消息,服務(wù)器端根據(jù)接收到的消息,發(fā)送CHATTING,NOTICE或USERList消息4、 服務(wù)器設(shè)計(jì)<1>、建立工程①、用MFCAppWizard(exe)新建一個(gè)“單個(gè)文檔”的工程;②、在Step2of6中,選“查看數(shù)據(jù)庫(kù)不使用文件支持”,點(diǎn)擊“DataSource..”按鈕,然后在彈出的對(duì)話框中選“DAO”類型,再瀏覽選擇數(shù)據(jù)庫(kù)文件Data.mdb.按確定,再在彈出的窗口選User表;③、點(diǎn)擊Next到Step4of6,選"windowsSockets”。網(wǎng)絡(luò)功能支持;④、按“NEXT",最后點(diǎn)擊“完成”;<2〉、在CSuperServerView中添加下列成員:intm_iPort;//服務(wù)器端口CSocketListen*m_pSocket; //監(jiān)聽(tīng)套接字。CSocketClientm_SocketClient[Max]; //跟客戶端通信的套接字。CArchive*m_pArOut;〃發(fā)送消息時(shí)的序列化文檔對(duì)象指針。CArchive*m_pArIn; 〃接收消息時(shí)的序列化化文檔對(duì)象指針。CSocketFile*m_pSF; //套接字文件對(duì)象指針。CMsgmsg;//消息類對(duì)象CStringDecode(intn,CStringstrMsg);//消息的解碼函數(shù)voidSendUserList();boolCheckLogin(CSocketClient*pClient);voidMyReceive(CSocketClient*pClient);voidMyClose(CSocketClient*pClient);voidMyAccept();<3〉、CSuperServerView類的關(guān)鍵成員函數(shù):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|驗(yàn)證失敗!";}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() //開(kāi)始服務(wù)(m_pSocket二newCSocketListen(this);m_pSocket->Create(m_iPort,SOCK_STREAM);m_pSocket->Listen();m_staState.SetWindowText("正在監(jiān)聽(tīng) ");}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("服務(wù)關(guān)閉”);}數(shù)據(jù)庫(kù)維護(hù)操作函數(shù):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()//查找?guī)?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類中的接受事件函數(shù)OnAccept(intnErrorCode)。voidCSocketListen::OnAccept(intnErrorCode)(m_pView->MyAccept();CSocket::OnAccept(nErrorCode);CSocketClient類中的接收消息函數(shù)。voidCSocketClient::OnClose(intnErrorCode)(//TODO:Addyourspecializedcodehereand/orcallthebaseclassm_pView->MyClose(this);CSocket::OnClose(nErrorCode);}CSocketClient類傳遞主窗口指針函數(shù):voidCSocketClient::GetView(CSuperServerView*pView)(m_pView=pView;}<4>、程序界面5、客戶端設(shè)計(jì)。<1>、建立一個(gè)名為Client,基與對(duì)話框的應(yīng)用程序,在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);構(gòu)造函數(shù)實(shí)現(xiàn),獲得指向主對(duì)話框的指針CMySocket::CMySocket(CClientDlg*pDlg)(m_pDlg=pDlg;}<3>、關(guān)鍵函數(shù)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()〃登錄函數(shù)(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("網(wǎng)絡(luò)原因,沒(méi)連上服務(wù)器!");}}voidCClientDlg::MyReceive()//接收消息函數(shù)(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年汽車電子產(chǎn)品項(xiàng)目投資申請(qǐng)報(bào)告代可行性研究報(bào)告
- 系繩物體的浮力問(wèn)題-2023年中考物理復(fù)習(xí)講練(原卷版)
- 知識(shí)產(chǎn)權(quán)保護(hù)承諾書
- 美麗的頤和園導(dǎo)游詞(33篇)
- 物流運(yùn)輸車輛租賃合同(35篇)
- 粗砂墊層試驗(yàn)段的施工方案及試驗(yàn)段總結(jié)
- 23.1 平均數(shù)與加權(quán)平均數(shù) 同步練習(xí)
- 天津市南開(kāi)區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期11月期中道德與法治試題(含答案)
- 2024年建筑電工(建筑特殊工種)考試試題題庫(kù)
- 黑龍江省大慶市肇源縣聯(lián)盟學(xué)校2024-2025學(xué)年七年級(jí)上學(xué)期11月期中生物試題(含答案)
- 行業(yè)協(xié)會(huì)財(cái)務(wù)管理制度
- 領(lǐng)款單模板(B5的紙).xls
- 特種設(shè)備使用的安全現(xiàn)狀與存在問(wèn)題的思考
- 總公司與分公司合并報(bào)表編制舉例
- 概率論與數(shù)理統(tǒng)計(jì)(茆詩(shī)松)第二版課后第二章習(xí)題參考答案_百度
- 錦綸染色過(guò)程的問(wèn)題與解決方法
- 土地租金發(fā)放表
- 醫(yī)院水電安裝施工方案
- 計(jì)算機(jī)網(wǎng)絡(luò)考試重點(diǎn)整理
- 水泥攪拌樁機(jī)械進(jìn)場(chǎng)安裝驗(yàn)收記錄表
- 高一物理的必修的一期中考試試卷解析告
評(píng)論
0/150
提交評(píng)論