MFC/Socket网络编程:[2]客户端

继上一篇有关服务器的网络编程,这里继续探讨客户端如何发出连接服务器的请求,如何与服务器进行数据传输,如何与其他客户端交换数据,最后如何断开与服务器之间的连接。

关键技术就是TCP/IP协议,socket默认使用的是非阻塞式异步传输通讯方式,对应MFC中的CSoket类,采用的是面向连接的TCP协议而不是UDP协议。

工具/原料

Visual Studio 2010/2013

方法/步骤

创建一个项目,与服务器端类似,别忘了选择“windows套接字”。创建好以后设计对话框界面。2个按钮,1个用来连接或者断开服务器,另一个用来发送数据;2个编辑框,一个用来显示接收到的数据,另一个用来输入需要发送的数据。

编辑控件的属性,通过类向导添加相应的变量,双击按钮添加按钮按下处理事件。

添加客户端类CClientSocket,通过类向导添加OnReceive函数。

修改客户端类的头文件:

/********************ClientSocket.h*********************/

#pragma once

class CClientSocket : public CSocket

{

public:

CClientSocket();

virtual ~CClientSocket();

virtual void OnReceive(int nErrorCode);

// 重写接收函数,通过类向导生成

BOOL SendMSG(LPSTR lpBuff, int nlen);

// 发送函数,用于发送数据给服务器

};

修改客户端类的源文件:

/********************ClientSocket.cpp*********************/

#include "stdafx.h"

#include "PhoneClient.h"

#include "ClientSocket.h"

#include "PhoneClientDlg.h"

CClientSocket::CClientSocket(){}

CClientSocket::~CClientSocket(){}

void CClientSocket::OnReceive(int nErrorCode)

{

// TODO: 在此添加专用代码和/或调用基类

char* pData = NULL;

pData = new char[1024];

memset(pData, 0, sizeof(char)* 1024);

UCHAR leng = 0;

CString str;

leng = Receive(pData, 1024, 0);

str = pData;

// 在编辑框中显示接收到的数据

((CPhoneClientDlg*)theApp.GetMainWnd())->SetDlgItemTextW(IDC_DataReceive, str);

delete pData;

pData = NULL;

CSocket::OnReceive(nErrorCode);

}

BOOL CClientSocket::SendMSG(LPSTR lpBuff, int nlen)

{

//生成协议头

if (Send(lpBuff, nlen) == SOCKET_ERROR)

{

AfxMessageBox(_T("发送错误!"));

return FALSE;

}

return TRUE;

}

说明:当客户端接收到服务器端发的数据时会响应接收函数OnReceive,这里只是简单的将获取的信息显示在编辑框中。SendMSG函数用于向服务器发送消息,函数会在主对话框类中调用。

修改对话框类的头文件,添加相关函数声明以及必要的变量定义:

bool m_connect;

CClientSocket* pSock; // 客户端套接字指针对象

BOOL WChar2MByte(LPCWSTR lpSrc, LPSTR lpDest, int nlen);

//字符转换函数

public:

virtual BOOL PreTranslateMessage(MSG* pMsg);

//防止按下enter、esc时退出程序

在对话框类的源文件中编写所有声明的函数,实现各项函数的功能。

1、 连接服务器的按钮事件处理函数

void CPhoneClientDlg::OnBnClickedConnect()

{

if (m_connect) // 如果已经连接,则断开服务器

{

m_connect = false;

pSock->Close();

delete pSock;

pSock = NULL;

m_ConPC.SetWindowTextW(_T("连接服务器"));

UpdateData(false);

return;

}

else // 未连接,则连接服务器

{

pSock = new CClientSocket();

if (!pSock->Create()) //创建套接字

{

AfxMessageBox(_T("创建套接字失败!"));

return;

}

}

if (!pSock->Connect(_T("127.0.0.1"), port)) //连接服务器

{

AfxMessageBox(_T("连接服务器失败!"));

return;

}

else

{

m_connect = true;

m_ConPC.SetWindowTextW(_T("断开服务器"));

UpdateData(false);

}

}

说明:本函数通过Create和Connect与服务器建立连接。由于在本机上测试,所以IP为127.0.0.1,实际应用时可以添加一个控件用于输入服务器的IP。端口号必须与服务器的一致,这里的port是一个常量:

#define port 8000

2、 发送按钮的事件处理函数

void CPhoneClientDlg::OnBnClickedSend()

{

// TODO: 在此添加控件通知处理程序代码

if (!m_connect)return; //未连接服务器则不执行

UpdateData(true); //获取界面数据

if (m_DataSend != "")

{

char* pBuff = new char[m_DataSend.GetLength() * 2];

memset(pBuff, 0, m_DataSend.GetLength() * 2);

WChar2MByte(m_DataSend.GetBuffer(0), pBuff, m_DataSend.GetLength() * 2);

pSock->SendMSG(pBuff, m_DataSend.GetLength() * 2);

}

}

说明:这里的SendMSG函数与服务器端的不一致,函数实体在CClientSocket类中以实现。WChar2MByte字符转换函数与服务器端的一致,在这不再赘述。

对话框的主要函数就是以上2个,一个用于连接和断开服务器,另一个用于发送数据。至于虚函数PreTeanslateMessage,其处理方法与服务器中介绍的一致。将服务器与客户端都编写好以后,就可以测试通讯效果,可以同时打开多个客户端,看看服务器如何处理。

注意事项

这篇经验需要参考上一篇关于服务器端编程的经验

服务器端与客户端通过socket实现网络通讯

标签:网络, 数据, 协议, 客户端, 服务器
分类:电脑软件
时间:2014-08-08

MFC/Socket网络编程:[2]客户端的相关文章

MFC/Socket网络编程:[1]服务器

Windows程序开发中,如果涉及到网络编程的话,一般少不了socket,socket作为应用层与传输层之间的一个抽象层,可以理解为应用程序与网络协议之间的编程接口。我曾通过MFC开发了一个简单C/S(客户端/服务器)模式的应用程序,主要是为了实现手机控制电脑,android网络编程也可以通过socket实现,这里以PC端编写服务器程序和客户端程序为例说明socket编程的一般步骤。

Java网络编程——客户端与服务端的简单连接

随着互联网技术的越来越快的发展,编程代码也从复杂变得越来越简单化,那么Java网络编程中,客户端与服务器端是如何建立起联系的呢?下面和我一起去看看吧!

Linux网络编程wait()和waitpid()的讲解

客户端断开连接后,服务器端存在大量僵尸进程。这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进程默认忽略了该信号。为避免僵尸进程的产生,无论我们什么时候创建子进程时,主进程都需要等待子进程返回,以便对子进程进行清理。为此,我们在服务器程序中添加SIGCHLD信号处理函数。 复制代码 代码如下: #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <strin

java网络编程方向具体该怎么去学

java的大方向就是j2eej2ee不仅仅是socket编程,具体包括13中核心技术J2EE的核心API与组 J2EE平台由一整套服务(Services)、应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对J2EE中的13种技术规范进行简单的描述(限于篇幅,这里只能进行简单的描述):

Linux网络编程之TCP网络编程

本文将实现在Linux系统下进行TCP网络编程的开发

android ndk 网络编程

最近一段时间不断的有朋友问我有没有android ndk相关的网络编程的测试用例或者资料,网上基本上又没有,本文主要: ① 不是android上Java网络编程; ② 不仅仅是liunx上网络编程; ③ 就连android ndk官方提供的测试用例也没有网络编程方面的资料; ④ 同时设计windows上服务器,android ndk上客户端的配置; ⑤ 本文是在android上的纯c/c++开发环境下进行的,不会设计Java代码; android ndk 如何进行网络编程?android ndk层进行网络

网络编程项目:Linux飞鸽传书通信[1]

相信学过网络编程很多都会去做飞鸽传书通信的项目吧。本经验是教会大家如何运用网络编程的知识来写出“Linux 飞鸽传书通信”的项目。本经验是通过linux系统终端来和飞秋软件(都是使用IPMSG协议)进行通信,具有聊天功能、上线提示、下线提示、广播和文件传输。

VS2013/MFC基于对话框编程:[1]创建MFC工程

VS2013作为最新版的Visual studio,界面和功能上相比之前的版本有了较大的改善和提高,MFC作为集成API的简单版更适合编程开发,许多应用软件都是基于对话框的,这里就介绍一下如何在VS2013中创建一个基于对话框的MFC项目。

网络编程——如何下载网页代码 源文件

网络编程的初学者来讲,模仿,产考一些简单的网页对我们的学习有很大的帮助,特别是对一些代码的认识和使用有极大的帮助,胜过书本和老师讲的知识。 如何下载网页上的代码呢? 网页上的代码常见的有这种下载方法,复制和快捷键,对于刚上门的新手可以选择由CSS编辑的网页做为下载对象。