典型网络数据库系统软件设计
2010-02-19 20:34:02 来源:WEB开发网5、客户端设计。
<1>、建立一个名为Client,基与对话框的应用程序,在Step 2 of 6中选Windows Sockts支持,
<2>、在CClientDlg中添加成员。
CString Decode(int n,CString strMsg);
在CMySocket类中添加成员。
CMsg msg;
CMySocket * m_pSocket;
CArchive * m_pArOut;
CArchive * m_pArIn;
CSocketFile * m_pSF;
void MyReceive();CClientDlg * m_pDlg;
构造函数实现,获得指向主对话框的指针
CMySocket(CClientDlg *pDlg);
CMySocket::CMySocket(CClientDlg *pDlg)
{
m_pDlg=pDlg;
}
<3>、关键函数
BOOL CClientDlg::OnInitDialog()
{
...
m_strHost="192.168.1.126";
m_iPort=1234;
UpdateData(FALSE);
GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(false);
Expand(0);
return TRUE; // return TRUE unless you set the focus to a control
}
void CClientDlg::OnLogin() //登录函数
{
UpdateData(TRUE);
GetDlgItem(IDC_BUTTON1)->SetWindowText("Wait");
m_pSocket=new CMySocket(this);
m_pSocket->Create();
int nTry=3,n;
do{
n=m_pSocket->Connect (m_strHost,m_iPort);
}while(n!=1 && nTry--);
if(n==1)
{
Sleep(2000);
m_pSF=new CSocketFile(m_pSocket);
m_pArOut=new CArchive(m_pSF,CArchive::store);
m_pArIn=new CArchive(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("网络原因,没连上服务器!");
}
}
void CClientDlg::MyReceive() //接收消息函数
{
msg.Serialize (*m_pArIn);
int i=0;
CString str;
switch(msg.m_eType )
{
case LOGINResponse:
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;
case USERList:
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;
case CHATTING:
MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的消息:");
break;
case NOTICE:
MessageBox(Decode(2,msg.m_strMsg),"来自"+Decode(1,msg.m_strMsg)+"的通知:");
break;
}
}
CMySocket类中的事件函数
OnReceive(int nErrorCode)。
void CMySocket::OnReceive(int nErrorCode)
{
m_pDlg->MyReceive (); //调用主窗口的接收函数
CSocket::OnReceive(nErrorCode);
}
更多精彩
赞助商链接