为了弄这个通信程序,花了我好几晚的时间。没办法,没有学过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位系统才行。
相关推荐
AsyncSocket是Mac OS X和iOS平台上用于网络编程的一个重要组件,它是Cocoa框架的一部分,提供了一种异步处理TCP套接字通信的方式。这个标题"AsyncSocket服务端,客户端"表明我们将探讨如何使用AsyncSocket来创建一个...
在提供的压缩包文件“异步通信AsyncSocket”中,可能包含了实现AsyncSocket通信的C源代码,开发者可以研究这些代码,了解如何在实际项目中应用异步通信。通过学习和实践,不仅可以提升网络编程技能,还能为构建高效...
AsyncSocket是iOS和macOS平台上一个著名的开源网络通信库,由GCD(Grand Central Dispatch)支持,用于实现异步的TCP套接字通信。这个库以其高效、稳定和易用性而受到开发者们的广泛赞誉。相比苹果提供的CFStream或...
在IT行业中,网络通信是不可或缺的一部分,而C++作为强大的编程语言,提供了多种实现网络通信的库和类。本项目“基于AsyncSocket的聊天室程序(VS2013版 c++)”就是利用Microsoft Foundation Class (MFC)库中的...
《通信聊天室AsyncSocket指针版》是一款基于Visual Studio 2008和MFC(Microsoft Foundation Classes)框架开发的对话框式通信应用。该应用的核心功能是利用AsyncSocket类进行网络通信,实现多用户之间的实时聊天。...
AsyncSocket是iOS和macOS平台上的一个开源网络通信库,由CocoaAsyncSocket项目提供,它使得开发者可以方便地在Objective-C或Swift中处理TCP套接字通信。这个库特别适用于需要进行异步数据传输的应用,例如即时通讯、...
本项目聚焦于"AsyncSocket服务端及用户端",它利用了Objective-C中的AsyncSocket库来构建一个高效的网络通信解决方案。AsyncSocket是由Rob Napier开发的一个强大的库,它简化了异步套接字编程,使得开发者可以更轻松...
本文将详细介绍如何使用`AsyncSocket`库进行异步Socket编程,该库是由Mike Ash开发的一个强大的Objective-C类,它使得在iOS应用中处理网络通信变得简单易行。 `AsyncSocket`库提供了异步的TCP套接字操作,能够同时...
AsyncSocket是由Rob Napier开发的Objective-C库,它封装了Cocoa的CFStream API,提供了异步TCP/IP套接字通信的能力。异步意味着在网络操作完成时,如数据接收或发送,系统会通知你的应用程序,而不是阻塞当前线程...
【标题】基本Udp的网络通信程序 在计算机网络编程中,UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输层协议。与TCP(传输控制协议)不同,UDP不保证数据的顺序、完整性和可靠性,但它...
AsyncSocket客服端服务端Demo是一个基于iOS平台的网络通信示例项目,主要涉及TCP和UDP两种传输协议,以及GCD(Grand Central Dispatch)的使用。这个Demo提供了客户端和服务端的基本交互,但并不是一个完整的应用...
这个库是由Mike Ash开发的,它为Objective-C程序员提供了简单易用的异步套接字通信接口,能够方便地实现服务器和客户端模式。在你提到的“iphone asyncsocket”项目中,我们可以看到它被应用于iPhone上的服务端和...
异步套接字(AsyncSocket)是Microsoft MFC(Microsoft Foundation Classes)库中提供的一种类,用于处理基于TCP/IP协议的网络通信。在VC++6.0环境下,开发者可以利用MFC的AsyncSocket类实现异步套接字编程,这是一...
在iOS和macOS开发中,当我们需要实现实时、低延迟的数据传输,特别是在构建网络应用程序时,`AsyncSocket`库是一个非常重要的工具。这个库是由Rob Napier开发的,它提供了一个简单易用的接口来处理TCP套接字通信。在...
AsyncSocket类通过事件驱动的方式处理网络通信,当网络事件发生时,如数据接收、连接建立或断开等,它会通知应用程序,而无需应用程序进行连续的轮询检查。 在使用AsyncSocket进行客户端编程时,首先需要创建一个...
AsyncSocket是iOS和macOS平台上一个非常流行的网络通信库,尤其在处理TCP套接字连接时,它提供了异步操作的能力,使得开发者可以方便地在应用程序中实现客户端和服务器之间的数据传输。标题“支持ARC的AsyncSocket类...