`
羊咩咩
  • 浏览: 14508 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

AsyncSocket的C/S通信程序

阅读更多

为了弄这个通信程序,花了我好几晚的时间。没办法,没有学过c++,socket也一通半解。

 

环境:win7+vs2010

项目:c++的MFC项目

编码:一定不能使用unicode编码,不然会乱码(这个纠结了我好多时间)

 

看看效果:

 

初始化时,服务端和客户端的效果图:

 

服务端监听,客户端连接,如果IP和端口正确就可以连上


 

 

双方发送消息个过程,新消息在最上方:

 

看看Client 的关键代码:

*Dlg.cpp

void CTcpChatClntDlg::OnBnClickedButtonConnect()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(FALSE);
	GetDlgItem(IDC_STATIC_SERVNAME)->EnableWindow(FALSE);
	GetDlgItem(IDC_STATIC_SERVPORT)->EnableWindow(FALSE);
	m_sConnectSocket.Create();		//创建客户端套接字
	m_sConnectSocket.Connect(m_strServName, m_nServPort);		//连接服务器
}


void CTcpChatClntDlg::OnBnClickedButtonClose()
{
	// TODO: 在此添加控件通知处理程序代码
	OnClose();
}


void CTcpChatClntDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	int nLen;
	int nSent;
	UpdateData(TRUE);
	if(!m_strMsg.IsEmpty()) {		//是否有消息
		nLen=m_strMsg.GetLength();	//得到消息长度
		//发送消息,返回实际发送的字节数
		nSent=m_sConnectSocket.Send(LPCTSTR(m_strMsg), nLen);		if(nSent!=SOCKET_ERROR) {
			//m_listSent.AddString(m_strMsg);
			m_listSent.InsertString(0,m_strMsg);
			UpdateData(FALSE);
		}
		else {
			AfxMessageBox(LPCTSTR("信息发送错误!"), MB_OK|MB_ICONSTOP);
		}
		m_strMsg.Empty();
		UpdateData(FALSE);
	}
}

void CTcpChatClntDlg::OnReceive() {
	char *pBuf=new char[1025];
	int nBufSize=1024;
	int nReceived;
	CString strReceived;
	nReceived = m_sConnectSocket.Receive(pBuf, nBufSize);
	if(nReceived!=SOCKET_ERROR) {
		pBuf[nReceived]=NULL;
		strReceived=pBuf;
		//m_listReceived.AddString(strReceived);
		m_listReceived.InsertString(0,strReceived);
		UpdateData(FALSE);
	}
	else{
		AfxMessageBox(LPCTSTR("信息接收错误!"), MB_OK|MB_ICONSTOP);
	}
}
void CTcpChatClntDlg::OnConnect() {
	GetDlgItem(IDC_EDIT_MSG)->EnableWindow(TRUE);
	GetDlgItem(IDOK)->EnableWindow(TRUE);
	GetDlgItem(IDC_STATIC_MSG)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(TRUE);
}
void CTcpChatClntDlg::OnClose() {
	m_sConnectSocket.Close();
	GetDlgItem(IDC_EDIT_MSG)->EnableWindow(FALSE);
	GetDlgItem(IDOK)->EnableWindow(FALSE);
	GetDlgItem(IDC_STATIC_MSG)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);
	while(m_listSent.GetCount()!=0) m_listSent.DeleteString(0);
    while(m_listReceived.GetCount()!=0) m_listReceived.DeleteString(0);
	GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(TRUE);
	GetDlgItem(IDC_STATIC_SERVNAME)->EnableWindow(TRUE);
	GetDlgItem(IDC_STATIC_SERVPORT)->EnableWindow(TRUE);
}

 

再看看Sever的关键代码:

*Dlg.cpp

void CTcpChatSvrDlg::OnBnClickedButtonListen()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	GetDlgItem(IDC_BUTTON_LISTEN)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(FALSE);
	GetDlgItem(IDC_STATIC_SERVNAME)->EnableWindow(FALSE);
	GetDlgItem(IDC_STATIC_SERVPORT)->EnableWindow(FALSE);
	m_sCListenSocket.Create(m_nServPort);
	m_sCListenSocket.Listen();
}


void CTcpChatSvrDlg::OnBnClickedButtonClose()
{
	// TODO: 在此添加控件通知处理程序代码
	OnClose();
}


void CTcpChatSvrDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	int nLen;
	int nSent;
	UpdateData(TRUE);
	if(!m_strMsg.IsEmpty()) {
		nLen=m_strMsg.GetLength();
		nSent=m_sConnectSocket.Send(LPCTSTR(m_strMsg), nLen);
		if(nSent!=SOCKET_ERROR) {
		//	m_listSent.AddString(m_strMsg);
			m_listSent.InsertString(0,m_strMsg);
			UpdateData(FALSE);
		}
		else {
			AfxMessageBox(LPCTSTR("信息发送错误!"), MB_OK|MB_ICONSTOP);
		}
		m_strMsg.Empty();
		UpdateData(FALSE);
	}

}

void CTcpChatSvrDlg::OnClose(void) {
	m_listReceived.AddString(LPCTSTR("服务器收到了OnClose信息"));
	m_sConnectSocket.Close();
	GetDlgItem(IDC_EDIT_MSG)->EnableWindow(FALSE);
	GetDlgItem(IDOK)->EnableWindow(FALSE);
	GetDlgItem(IDC_STATIC_MSG)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);
	while(m_listSent.GetCount()!=0) m_listSent.DeleteString(0);
	while(m_listReceived.GetCount()!=0) m_listReceived.DeleteString(0);
	GetDlgItem(IDC_BUTTON_LISTEN)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(TRUE);
	GetDlgItem(IDC_STATIC_SERVNAME)->EnableWindow(TRUE);
	GetDlgItem(IDC_STATIC_SERVPORT)->EnableWindow(TRUE);
}
void CTcpChatSvrDlg::OnAccept(void) {
	m_listReceived.AddString(LPCTSTR("服务器收到了OnAccept消息"));
	m_sCListenSocket.Accept(m_sConnectSocket);
	GetDlgItem(IDC_EDIT_MSG)->EnableWindow(TRUE);
	GetDlgItem(IDOK)->EnableWindow(TRUE);
	GetDlgItem(IDC_STATIC_MSG)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(TRUE);
}
void CTcpChatSvrDlg::OnReceive(void) {
	char *pBuf=new char[1025];
	int nBufSize=1024;
	int nReceived;
	CString strReceived;
	//m_listReceived.AddString(LPCTSTR("服务器收到了OnReceive消息"));
	nReceived=m_sConnectSocket.Receive(pBuf,nBufSize);
	if(nReceived!=SOCKET_ERROR) {
		pBuf[nReceived]=NULL;
		strReceived=pBuf;
		//m_listReceived.AddString(strReceived);
		m_listReceived.InsertString(0,strReceived);
		UpdateData(FALSE);
	}
	else {
		AfxMessageBox(LPCTSTR("信息接收错误!"), MB_OK|MB_ICONSTOP);
	}
}

 

好吧,其实还不是很懂的。不过浪费了这么多时间,还是记录下吧。

附件里有两个相应的EXE程序,有兴趣可以玩一下。不过要64位系统才行。

  • 大小: 15.1 KB
  • 大小: 16.2 KB
  • 大小: 17.3 KB
分享到:
评论

相关推荐

    AsyncSocket服务端,客户端

    AsyncSocket是Mac OS X和iOS平台上用于网络编程的一个重要组件,它是Cocoa框架的一部分,提供了一种异步处理TCP套接字通信的方式。这个标题"AsyncSocket服务端,客户端"表明我们将探讨如何使用AsyncSocket来创建一个...

    异步通信AsyncSocket

    在提供的压缩包文件“异步通信AsyncSocket”中,可能包含了实现AsyncSocket通信的C源代码,开发者可以研究这些代码,了解如何在实际项目中应用异步通信。通过学习和实践,不仅可以提升网络编程技能,还能为构建高效...

    AsyncSocket

    AsyncSocket是iOS和macOS平台上一个著名的开源网络通信库,由GCD(Grand Central Dispatch)支持,用于实现异步的TCP套接字通信。这个库以其高效、稳定和易用性而受到开发者们的广泛赞誉。相比苹果提供的CFStream或...

    基于AsyncSocket的聊天室程序(VS2013版 c++)

    在IT行业中,网络通信是不可或缺的一部分,而C++作为强大的编程语言,提供了多种实现网络通信的库和类。本项目“基于AsyncSocket的聊天室程序(VS2013版 c++)”就是利用Microsoft Foundation Class (MFC)库中的...

    通信聊天室AsyncSocket指针版

    《通信聊天室AsyncSocket指针版》是一款基于Visual Studio 2008和MFC(Microsoft Foundation Classes)框架开发的对话框式通信应用。该应用的核心功能是利用AsyncSocket类进行网络通信,实现多用户之间的实时聊天。...

    AsyncSocket源文件

    AsyncSocket是iOS和macOS平台上的一个开源网络通信库,由CocoaAsyncSocket项目提供,它使得开发者可以方便地在Objective-C或Swift中处理TCP套接字通信。这个库特别适用于需要进行异步数据传输的应用,例如即时通讯、...

    AsyncSocket服务端及用户端

    本项目聚焦于"AsyncSocket服务端及用户端",它利用了Objective-C中的AsyncSocket库来构建一个高效的网络通信解决方案。AsyncSocket是由Rob Napier开发的一个强大的库,它简化了异步套接字编程,使得开发者可以更轻松...

    ios socket AsyncSocket使用

    本文将详细介绍如何使用`AsyncSocket`库进行异步Socket编程,该库是由Mike Ash开发的一个强大的Objective-C类,它使得在iOS应用中处理网络通信变得简单易行。 `AsyncSocket`库提供了异步的TCP套接字操作,能够同时...

    基于第三方AsyncSocket的Demo

    AsyncSocket是由Rob Napier开发的Objective-C库,它封装了Cocoa的CFStream API,提供了异步TCP/IP套接字通信的能力。异步意味着在网络操作完成时,如数据接收或发送,系统会通知你的应用程序,而不是阻塞当前线程...

    基本Udp的网络通信程序

    【标题】基本Udp的网络通信程序 在计算机网络编程中,UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输层协议。与TCP(传输控制协议)不同,UDP不保证数据的顺序、完整性和可靠性,但它...

    AsyncSocket客服端服务端Demo

    AsyncSocket客服端服务端Demo是一个基于iOS平台的网络通信示例项目,主要涉及TCP和UDP两种传输协议,以及GCD(Grand Central Dispatch)的使用。这个Demo提供了客户端和服务端的基本交互,但并不是一个完整的应用...

    iphone asyncsocket

    这个库是由Mike Ash开发的,它为Objective-C程序员提供了简单易用的异步套接字通信接口,能够方便地实现服务器和客户端模式。在你提到的“iphone asyncsocket”项目中,我们可以看到它被应用于iPhone上的服务端和...

    利用AsyncSocket与后台数据交互

    在iOS和macOS开发中,当我们需要实现实时、低延迟的数据传输,特别是在构建网络应用程序时,`AsyncSocket`库是一个非常重要的工具。这个库是由Rob Napier开发的,它提供了一个简单易用的接口来处理TCP套接字通信。在...

    VC++异步套接字类(AsyncSocket),进行“异步非阻塞”客户/服务器(Client/Server)网络程序设计的方法与原理。

    AsyncSocket类通过事件驱动的方式处理网络通信,当网络事件发生时,如数据接收、连接建立或断开等,它会通知应用程序,而无需应用程序进行连续的轮询检查。 在使用AsyncSocket进行客户端编程时,首先需要创建一个...

    支持ARC的AsyncSocket类下载

    AsyncSocket是iOS和macOS平台上一个非常流行的网络通信库,尤其在处理TCP套接字连接时,它提供了异步操作的能力,使得开发者可以方便地在应用程序中实现客户端和服务器之间的数据传输。标题“支持ARC的AsyncSocket类...

    IOS AsyncSocket

    AsyncSocket是一个用Object-c封装好的网络通讯API,调用方便,容易实现 使用AsyncSocket可以很方便的与其它系统进行Socket通信, AsyncSocket包括TCP和UDP,通过实现委托AsyncSocketDelegate进行交互。 首先,调用此...

Global site tag (gtag.js) - Google Analytics