VC网络数据库开发.docx
《VC网络数据库开发.docx》由会员分享,可在线阅读,更多相关《VC网络数据库开发.docx(19页珍藏版)》请在冰豆网上搜索。
VC网络数据库开发
VC网络数据库开发(2006-6-3016:
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)主键:
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不同而不同。
m_eType
m_strMsg
LOGIN
呢称|密码
LOGINResponse
GOOD|欢迎!
(BOSS)或FAILED|验证失败!
CHATTING
发给(来自)的用户名|消息内容
USERList
呢称1|呢称2|…|呢称n|END
NOTICE
ALL|消息内容或来自的用户|消息内容
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;
else
str=strMsg.Left(pos);
strMsg=strMsg.Right(strMsg.GetLength()-pos-1);
}
returnstr;
<4>、消息发送接收的序列化函数
voidCMsg:
:
Serialize(CArchive&ar)
if(ar.IsStoring())
ar<}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{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{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{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("正在监听......");}voidCSuperServerView::OnStopServer()//关闭服务{if(m_pSocket)m_pSocket->Close();for(inti=0;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(IDC_BUTTON1)->EnableWindow(false);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(true);}break;caseUSERList:str=Decode(++i,msg.m_strMsg);m_ctrList.ResetContent();while(str!="END"){if(str!=m_strName)m_ctrList.AddString(str);str=Decode(++i,msg.m_strMsg);}UpdateData(FALSE);break;caseCHATTING:MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的消息:");break;caseNOTICE:MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的通知:");break;}}CMySocket类中的事件函数OnReceive(intnErrorCode)。voidCMySocket::OnReceive(intnErrorCode){m_pDlg->MyReceive();//调用主窗口的接收函数CSocket::OnReceive(nErrorCode);}<4>、程序界面①、登录界面②、登录成功(左为User组用户登录后界面,右为Boss组的)③、发送消息④、接收消息三、结束语 这是一个基于网络和数据库的系统模型,有点学习的价值。程序还有一些功能没完善的地方,并且存在一些Bug。
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_pArOut=newCArchive(m_pSF,CArchive:
store);
msg.m_eType=LOGINResponse;
if(CheckLogin(pClient))
if(!
pClient->m_bBoss)
msg.m_strMsg="GOOD|欢迎!
";
bOK=true;
msg.m_strMsg="GOOD|BOSS";
msg.m_strMsg="FAILED|验证失败!
msg.Serialize(*m_pArOut);
m_pArOut->Flush();
if(bOK)SendUserList();
break;
caseCHATTING:
//处理普通消息
for(i=0;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{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{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("正在监听......");}voidCSuperServerView::OnStopServer()//关闭服务{if(m_pSocket)m_pSocket->Close();for(inti=0;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(IDC_BUTTON1)->EnableWindow(false);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(true);}break;caseUSERList:str=Decode(++i,msg.m_strMsg);m_ctrList.ResetContent();while(str!="END"){if(str!=m_strName)m_ctrList.AddString(str);str=Decode(++i,msg.m_strMsg);}UpdateData(FALSE);break;caseCHATTING:MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的消息:");break;caseNOTICE:MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的通知:");break;}}CMySocket类中的事件函数OnReceive(intnErrorCode)。voidCMySocket::OnReceive(intnErrorCode){m_pDlg->MyReceive();//调用主窗口的接收函数CSocket::OnReceive(nErrorCode);}<4>、程序界面①、登录界面②、登录成功(左为User组用户登录后界面,右为Boss组的)③、发送消息④、接收消息三、结束语 这是一个基于网络和数据库的系统模型,有点学习的价值。程序还有一些功能没完善的地方,并且存在一些Bug。
if(m_SocketClient[i].m_bBusy)
if(m_SocketClient[i].m_strName==Decode(1,msg.m_strMsg))
m_pSF=newCSocketFile(&m_SocketClient[i]);
msg.m_strMsg=pClient->m_strName+"|"+Decode(2,msg.m_strMsg);
caseNOTICE:
//处理广播消息。
for(i=0;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{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("正在监听......");}voidCSuperServerView::OnStopServer()//关闭服务{if(m_pSocket)m_pSocket->Close();for(inti=0;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(IDC_BUTTON1)->EnableWindow(false);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(true);}break;caseUSERList:str=Decode(++i,msg.m_strMsg);m_ctrList.ResetContent();while(str!="END"){if(str!=m_strName)m_ctrList.AddString(str);str=Decode(++i,msg.m_strMsg);}UpdateData(FALSE);break;caseCHATTING:MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的消息:");break;caseNOTICE:MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的通知:");break;}}CMySocket类中的事件函数OnReceive(intnErrorCode)。voidCMySocket::OnReceive(intnErrorCode){m_pDlg->MyReceive();//调用主窗口的接收函数CSocket::OnReceive(nErrorCode);}<4>、程序界面①、登录界面②、登录成功(左为User组用户登录后界面,右为Boss组的)③、发送消息④、接收消息三、结束语 这是一个基于网络和数据库的系统模型,有点学习的价值。程序还有一些功能没完善的地方,并且存在一些Bug。
if(m_SocketClient[i].m_bBusy&&
m_SocketClient[i].m_strName!
=pClient->m_strName)
MyAccept()
for(inti=0;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("正在监听......");}voidCSuperServerView::OnStopServer()//关闭服务{if(m_pSocket)m_pSocket->Close();for(inti=0;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(IDC_BUTTON1)->EnableWindow(false);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(true);}break;caseUSERList:str=Decode(++i,msg.m_strMsg);m_ctrList.ResetContent();while(str!="END"){if(str!=m_strName)m_ctrList.AddString(str);str=Decode(++i,msg.m_strMsg);}UpdateData(FALSE);break;caseCHATTING:MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的消息:");break;caseNOTICE:MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的通知:");break;}}CMySocket类中的事件函数OnReceive(intnErrorCode)。voidCMySocket::OnReceive(intnErrorCode){m_pDlg->MyReceive();//调用主窗口的接收函数CSocket::OnReceive(nErrorCode);}<4>、程序界面①、登录界面②、登录成功(左为User组用户登录后界面,右为Boss组的)③、发送消息④、接收消息三、结束语 这是一个基于网络和数据库的系统模型,有点学习的价值。程序还有一些功能没完善的地方,并且存在一些Bug。
m_SocketClient[i].m_bBusy)
m_pSocket->Accept(m_SocketClient[i]);
m_SocketClient[i].GetView(this);
OnStartServer()//开始服务
m_pSocket=newCSocketListen(this);
m_pSocket->Create(m_iPort,SOCK_STREAM);
m_pSocket->Listen();
m_staState.SetWindowText("正在监听......");
OnStopServer()//关闭服务
if(m_pSocket)m_pSocket->Close();
for(inti=0;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(IDC_BUTTON1)->EnableWindow(false);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(true);}break;caseUSERList:str=Decode(++i,msg.m_strMsg);m_ctrList.ResetContent();while(str!="END"){if(str!=m_strName)m_ctrList.AddString(str);str=Decode(++i,msg.m_strMsg);}UpdateData(FALSE);break;caseCHATTING:MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的消息:");break;caseNOTICE:MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的通知:");break;}}CMySocket类中的事件函数OnReceive(intnErrorCode)。voidCMySocket::OnReceive(intnErrorCode){m_pDlg->MyReceive();//调用主窗口的接收函数CSocket::OnReceive(nErrorCode);}<4>、程序界面①、登录界面②、登录成功(左为User组用户登录后界面,右为Boss组的)③、发送消息④、接收消息三、结束语 这是一个基于网络和数据库的系统模型,有点学习的价值。程序还有一些功能没完善的地方,并且存在一些Bug。
m_SocketClient[i].Close();
m_SocketClient[i].m_bBusy=false;
m_staState.SetWindowText("服务关闭");
数据库维护操作函数:
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);
OnButtonDel()//删除帐户
m_pSet->Delete();
m_pSet->MoveNext();
if(m_pSet->IsEOF())
m_pSet->MoveFirst();
OnButtonModify()//修改帐户信息
dlg.m_strName=m_pSet->m_Name;
dlg.m_strPwd=m_pSet->m_Password;
dlg.m_iG=m_pSet->m_G_;
m_pSet->Edit();
OnButtonFind()//查找帐户
CFindDLGdlg;
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+"''");
CSocketListen类中的接受事件函数OnAccept(intnErrorCode)。
voidCSocketListen:
OnAccept(intnErrorCode)
m_pView->MyAccept();
CSocket:
OnAccept(nErrorCode);
CSocketClient类中的接收消息函数。
voidCSocketClient:
OnClose(intnErrorCode)
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
m_pView->MyClose(this);
OnClose(nErrorCode);
CSocketClient类传递主窗口指针函数:
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;
GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(false);
Expand(0);
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
voidCClientDlg:
OnLogin()//登录函数
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);
msg.m_eType=LOGIN;
msg.m_strMsg=m_strName+"|"+m_strPwd;
GetDlgItem(IDC_BUTTON1)->SetWindowText("Login");
GetDlgItem(IDC_BUTTON1)->EnableWindow(true);
AfxMessageBox("网络原因,没连上服务器!
");
MyReceive()//接收消息函数
inti=0;
caseLOGINResponse:
str=Decode(1,msg.m_strMsg);
if(str=="FAILED")
str=Decode(2,msg.m_strMsg);
m_pSocket->Close();
AfxMessageBox(str);
Expand(true);
GetDlgItem(IDC_BUTTON1)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(true);
caseUSERList:
str=Decode(++i,msg.m_strMsg);
m_ctrList.ResetContent();
while(str!
="END")
if(str!
=m_strName)
m_ctrList.AddString(str);
MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的消息:
MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的通知:
CMySocket类中的事件函数OnReceive(intnErrorCode)。
voidCMySocket:
OnReceive(intnErrorCode)
m_pDlg->MyReceive();//调用主窗口的接收函数
OnReceive(nErrorCode);
①、登录界面
②、登录成功(左为User组用户登录后界面,右为Boss组的)
③、发送消息
④、接收消息
三、结束语
这是一个基于网络和数据库的系统模型,有点学习的价值。
程序还有一些功能没完善的地方,并且存在一些Bug。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1