VC++实现简易客户端与服务端的连接

一、客户端的建立
1、建立工程文件
VC++实现简易客户端与服务端的连接_第1张图片
与往常的建立工程方法前面全部相同,但到图片中这步时一定要选中套接字。
2.创建类名为CClientSocket的客户Socket对象,下面给工程添加类,选择菜单命令“项目”→“添加类”
VC++实现简易客户端与服务端的连接_第2张图片
3.在“MFC类向导”对话框中输入类名CClientSocket,向导将自动为这个添加的类生成名为“ClientSocket.h”和“ClientSocket.cpp”的头文件和源文件:
VC++实现简易客户端与服务端的连接_第3张图片
4、头文件ChatClientDlg.h中添加如下两行代码:

#include "ClientSocket.h"  	//使主界面程序能够访问Socket类的代码文件
CClientSocket m_ClientSocket;//为了后面与服务器通信而定义的Socket成员变量

VC++实现简易客户端与服务端的连接_第4张图片
以上两行代码的添加位图片置所示中“//ADD”记号之间标出的部分。
5、反过来要使Socket能够访问到主界面上的控件,以便能够将自己的状况随时反映给主程序并在主界面上显示出来,也需要在Socket源文件ClientSocket.cpp中添加头文件声明:

#include "ChatClientDlg.h"

同理,要使服务端程序能够创建和控制本地的Socket,也要在服务端工程界面控制模块的头文件ChatServerDlg.h中添加如下代码:

#include "ListenSocket.h"   	//使主界面程序能够访问监听Socket类的代码文件
#include "ServerSocket.h"   	//使主界面程序能够访问服务Socket类的代码文件
CServerSocket m_ServerSocket;	//为了后面与客户通信而定义的Socket成员变量
CListenSocket m_ListenSocket;	//为了监听客户端的连接请求而定义的Socket成员变量

以上四行代码的添加位置如图所示中“//ADD”记号之间标出的部分。
VC++实现简易客户端与服务端的连接_第5张图片
6、完成的客户端简化界面上,包括IP地址控件、列表框各1个,文本框两个,四个按钮。
VC++实现简易客户端与服务端的连接_第6张图片
用相同的方法设置服务器端的用户界面如图所示,也一样为IP地址控件关联变量ServerIP,为文本框控件关联int型变量sPort,为列表框关联变量m_ListWords。
VC++实现简易客户端与服务端的连接_第7张图片
7、在类视图中选中CClientSocket,在界面右下角的属性窗口中单击“重写”按钮,就可以为该Socket类编写被动响应网络事件的函数。
VC++实现简易客户端与服务端的连接_第8张图片
8、(1)选择OnConnect()函数,为其添加代码,系统将该函数的代码自动置于ClientSocket.cpp文件中。
OnConnect()函数代码如下:

//确认客户端是否成功连接到服务器
if(nErrorCode)
{
     
		AfxMessageBox("连接失败,请您重试!");
		return;
}
((CChatClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString("连接服务器成功!");
((CChatClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.SetTopIndex(
((CChatClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.GetCount()- 1);

(2)服务器端源码(ChatServerDlg.cpp文件中)。
“开始监听”按钮的事件过程如下:

//监听开始,服务器等待连接请求的到来
BYTE nFild[4];
CString sIP,sP;
UpdateData();
ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
sIP.Format("%d.%d.%d.%d",nFild[0],nFild[1],nFild[2],nFild[3]);
sP.Format("%d",sPort);
m_ListenSocket.Create(sPort,1,FD_ACCEPT,sIP);	//创建服务端监听Socket
m_ListenSocket.Listen(1);						//开始监听
m_ListWords.AddString("监听开始:");
m_ListWords.AddString("地址" + sIP + "  端口" + sP);
m_ListWords.AddString("等待客户端连接……");
Listen()函数用于侦听连接请求,原型为:
BOOL Listen(int nConnectionBackloh = 5);

(3)OnReceive()函数代码(ServerSocket.cpp文件中):

//接收客户端发来的信息
char szTemp[200];
int n = Receive(szTemp,200);			//接收信息
szTemp[n] = '\0';
CString sTemp;
sTemp.Format("收到:%s",szTemp);
((CChatServerDlg *)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString(sTemp);
//显示信息
((CChatServerDlg *)(AfxGetApp()->m_pMainWnd))->m_ListWords.SetTopIndex(
	         ((CChatServerDlg *)(AfxGetApp()->m_pMainWnd))->m_ListWords.GetCount() - 1);
OnClose()代码:
//关闭与客户端的通信信道
((CChatServerDlg *)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString("客户端断开连接");
((CChatServerDlg *)(AfxGetApp()->m_pMainWnd))->m_ListWords.SetTopIndex(
((CChatServerDlg *)(AfxGetApp()->m_pMainWnd))->m_ListWords.GetCount()-1);
Close();					//关闭与客户端通信的Socke

9、运行结果
现在这个程序已经具备了最简单的单向通信功能,客户端发出信息服务器端可以收到,运行结果如图
VC++实现简易客户端与服务端的连接_第9张图片
总结与反思:在做这个工程的时候要注意添加变量时,字母的大小写,何时大写何时小写都十分讲究,并且整个工程从开始命名起,后面的整个文件都和命名的有关,每一步都十分重要,一定要按步骤来注意细心,多和同学老师交流,不要自己埋头苦干,遇到错误时,及时和别人交流,及时改正。

你可能感兴趣的:(数字图像处理,算法,计算机视觉,vc++)