为了弄这个通信程序,花了我好几晚的时间。没办法,没有学过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位系统才行。
相关推荐
可进行本地 通信,服务端,客户端,需修改本地ip地址进行匹配
用AsyncSocket编写的聊天室程序,支持一个服务器端,多个客户端
异步通信AsyncSocket,包含c源代码.
开源的AsyncSocket,最新版本,比苹果提供的好用多了
AsyncSocket是一个用Object-c封装好的网络通讯API,调用方便,容易实现 使用AsyncSocket可以很方便的与其它系统进行Socket通信, AsyncSocket包括TCP和UDP,通过实现委托AsyncSocketDelegate进行交互。 首先,调用此...
在iOS开发中使用socket,一般都是用第三方库AsyncSocket,不得不承认这个库确实很强大。下载地址CocoaAsyncSocket 。 特性 AsyncSocket类是支持TCP的。 AsyncUdpSocket是支持UDP的。 AsyncSocket是封装了CFSocket和...
AsyncSocket源文件 的工具文件
初学者值得借鉴,主要是基于AsyncSocket建立的Socket通信代码
/** * In the event of an error, the socket is closed. * You may call "unreadData" during this call-back ...- (NSRunLoop *)onSocket:(AsyncSocket *)sock wantsRunLoopForNewSocket:(AsyncSocket *)newSocket;
VS2008下的MFC对话框通信聊天室源代码用的是AsyncSocket
AsyncSocket客服端服务端Demo资源,里面有接口测试,不是完整的应用程序,需要根据自身需要修改
使用VC++异步套接字类(AsyncSocket),进行“异步非阻塞”客户/服务器(Client/Server)网络程序设计的方法与原理。
利用AsyncSocket与后台数据交互
支持ARC的AsyncSocket类下载
基于第三方AsyncSocket的Demo,简单的例子,用户需要根据需求修改代码