画出如图界面,新建mfc项目->对话框项目->windows套接字
然后在工具栏中拖入控件
每个控件都可以添加控制变量以便在事件触发时控制按键
文件结构:
一般都是头文件和cpp文件同名一份,头文件定义虚拟方法由cpp文件实现
通信流程如下:
五个状态:
在资源视图里双击按钮可创建点击后事件处理函数
//连接事件处理--连上服务器
void CCHAT_ClientDlg::OnBnClickedConn()
{
// TODO: 在此添加控件通知处理程序代码
BYTE nFild[4];
CString CIP;
UpdateData();
m_IpAddress.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
CIP.Format("%d.%d.%d.%d",nFild[0],nFild[1],nFild[2],nFild[3]);
m_ClientSocket.Create();
m_ClientSocket.Connect(CIP,Port);
}
//退出事件处理
void CCHAT_ClientDlg::OnBnClickedExit()
{
// TODO: 在此添加控件通知处理程序代码
exit(0);
}
//断开按钮事件处理--断开socket连接
void CCHAT_ClientDlg::OnBnClickedDisconn()
{
// TODO: 在此添加控件通知处理程序代码
m_IpAddress.EnableWindow();
m_portCtr.EnableWindow();
m_ButtonConn.EnableWindow();
m_ButtonDisConn.EnableWindow(false);
m_sendMSG.EnableWindow(false);
m_ButtonSend.EnableWindow(false);
m_ButtonExit.EnableWindow();
m_ClientSocket.Close();
m_List.AddString("从服务器断开");
}
//发送按钮
void CCHAT_ClientDlg::OnBnClickedSendmsg()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
m_ClientSocket.Send(m_sendText,m_sendText.GetLength());
cout<<m_sendText<<" 长度"<<m_sendText.GetLength()
<<endl;
m_List.AddString("发送 : "+m_sendText);
}
//清空 按钮
void CCHAT_ClientDlg::OnBnClickedClc()
{
// TODO: 在此添加控件通知处理程序代码
m_List.ResetContent();//清空历史信息
}
//关于按钮
void CCHAT_ClientDlg::OnBnClickedAbout()
{
// TODO: 在此添加控件通知处理程序代码
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
连接事件要在CAsyncSocket的状态中重写
//连接状态
void CClientSocket::OnConnect(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
CAsyncSocket::OnConnect(nErrorCode);
if(nErrorCode)
{
AfxMessageBox("连接失败,请你重试");
return;
}
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_List.AddString("连接服务器成功");
//控件处理
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_IpAddress.EnableWindow(false);
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_portCtr.EnableWindow(false);
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ButtonConn.EnableWindow(false);
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ButtonDisConn.EnableWindow();
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_sendMSG.EnableWindow();
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ButtonSend.EnableWindow();
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ButtonExit.EnableWindow(false);
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ButtonClear.EnableWindow();
}
//接收状态
void CClientSocket::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
CAsyncSocket::OnReceive(nErrorCode);
char szTemp[200];
int n=Receive(szTemp,200);
szTemp[n]='\0';
CString sTemp;
sTemp.Format("收到 :%s",szTemp);
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_List.AddString(sTemp);
}
//关闭状态
void CClientSocket::OnClose(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
CAsyncSocket::OnClose(nErrorCode);
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_List.AddString("从服务器断开了!");
Close();
//控件处理
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_IpAddress.EnableWindow();
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_portCtr.EnableWindow();
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ButtonConn.EnableWindow();
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ButtonDisConn.EnableWindow(false);
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_sendMSG.EnableWindow(false);
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ButtonSend.EnableWindow(false);
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ButtonExit.EnableWindow();
}
((CCHAT_ClientDlg*)(AfxGetApp()->m_pMainWnd))-> 可获得app的控制以便获取里面定义的变量