MFC通信项目之--单线程聊天室

本文介绍如何使用MFC创建一个简单的聊天客户端应用,包括界面设计、控件使用及Windows套接字编程。详细展示了连接、发送消息、断开连接等功能的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



 

 画出如图界面,新建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的控制以便获取里面定义的变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值