`
chentingk
  • 浏览: 19078 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

 
阅读更多



 

 画出如图界面,新建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.6 KB
  • 大小: 12.1 KB
  • 大小: 31.6 KB
  • 大小: 43.1 KB
  • 大小: 24.3 KB
  • 大小: 155.2 KB
  • 大小: 3 KB
分享到:
评论

相关推荐

    VS实现MFC的点对点聊天室

    用VS 2017的MFC实现客户端和服务器的点对点聊天功能,所有代码在VS 2017中能直接运行,主要实现CAsyncSocket类的编程,包括创建CAsyncSocket对象、建立连接、发送和接收数据等,从CAsyncSocket类派生出自己的WinSock...

    基于MFC的简单网络聊天室

    单界面,在界面内可以选择是服务端还是客户端,先运行服务端,点击监听按钮,与客户端连接成功后可以通信。未使用到多线程技术,代码段都有注释,适合初学者。

    vc++ 开发实例源码包

    18:单线程下载时不能创建临时文件. 19:下载流文件(rm,Media Player). Notepad++ V5.6.8 源码! 如题。 OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要...

    TCP一对多通信_基于Select模型

    我用MFC VC6编写的一个 TCP 一对多通信的程序(MFC 对话框程序),就是服务器端利用Select模型技术, 能同时接收多个客户端的消息, 其次, 服务器端还能将消息群发给所有已连接的客户端, 实现的基本思路 是使用...

    网络编程实用教程(第三版).zip

    5.5.3 聊天室服务器端程序的主要实现代码和分析 154 5.5.4 创建聊天室的客户端程序 162 5.5.5 聊天室客户端程序的主要实现代码和分析 163 习题 170 实验 170 第6章 WinInet编程 172 6.1 MFC WinInet类 ...

    VC与Labview、Matlab编程论文资料[2].rar

    基于MFC实现的小型局域网聊天室.pdf 基于MFC平台下的语音识别系统的设计.pdf 基于MFC的Direct3D应用开发研究.pdf 基于MFC的OpenGL图形开发.pdf 基于MFC的SWF动画文件解析设计.pdf 基于MFC的UG二次开发方法的研究.pdf...

    VC与Labview、Matlab编程论文资料

    基于MFC实现的小型局域网聊天室.pdf 基于MFC平台下的语音识别系统的设计.pdf 基于MFC的Direct3D应用开发研究.pdf 基于MFC的OpenGL图形开发.pdf 基于MFC的SWF动画文件解析设计.pdf 基于MFC的UG二次开发方法的研究.pdf...

    VC与Labview、Matlab编程论文资料[4].rar

    基于MFC实现的小型局域网聊天室.pdf 基于MFC平台下的语音识别系统的设计.pdf 基于MFC的Direct3D应用开发研究.pdf 基于MFC的OpenGL图形开发.pdf 基于MFC的SWF动画文件解析设计.pdf 基于MFC的UG二次开发方法的研究.pdf...

    vc++ 应用源码包_1

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

    vc++ 应用源码包_2

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

    vc++ 应用源码包_6

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

    vc++ 应用源码包_5

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

    vc++ 应用源码包_3

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

Global site tag (gtag.js) - Google Analytics