实验五FTP客户端.docx

上传人:b****6 文档编号:8223549 上传时间:2023-01-30 格式:DOCX 页数:13 大小:24.73KB
下载 相关 举报
实验五FTP客户端.docx_第1页
第1页 / 共13页
实验五FTP客户端.docx_第2页
第2页 / 共13页
实验五FTP客户端.docx_第3页
第3页 / 共13页
实验五FTP客户端.docx_第4页
第4页 / 共13页
实验五FTP客户端.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实验五FTP客户端.docx

《实验五FTP客户端.docx》由会员分享,可在线阅读,更多相关《实验五FTP客户端.docx(13页珍藏版)》请在冰豆网上搜索。

实验五FTP客户端.docx

实验五FTP客户端

实验五FTP客户端实现

WinInet介绍:

2338534

(1)WinInet是一个网络编程接口,包含了Internet底层协议HTTP,FTP。

(2)借助WinInet接口,可不必去了解Winsock、TCP/IP和特定Internet协议

  的细节就可以编写Internet客户端程序。

(3)WinInet为HTTP、FTP提供了统一的函数集,也就是Win32API接口。

(4)WinInet简化了HTTP、FTP协议的编程,可轻松地将Internet集成到应用程序中。

一、实验目的

(1)掌握列表框控件的使用

(2)了解MFCWinInet类应用程序编程原理

二、实验原理

本程序实现基本的FTP客户端功能,能登陆FTP服务器,显示登录客户目录下的文件,能从该目录中选择下载服务器的文件,也能向服务器上传文件。

应用程序的类型是基于对话框的,主对话框用户界面如图1所示:

图1Ftp客户端程序的主对话框

三个文本编辑框,分别用于输入FTP服务器域名,登录用户名和登录口令。

一个列表框,用来显示FTP服务器当前目录的内容,并允许用户从中选择文件下载。

四个命令按钮分别执行查询、上传、下载和退出的功能。

用户执行程序的流程是:

进行各种操作之前,应首先输入服务器域名,登录用户名和口令。

如果要进行查询,可以点击‘查询’按钮,调用OnQuery函数。

该函数获得用户当前输入的服务器名、登录用户名和口令等信息,清除列表框的内容;然号创建Internet会话类对象,进行服务器的登录,试图建立与指定FTP服务器的连接;如果连接成功,就创建CFtpFileFind文件检索类对象,查找服务器上当前目录的任意文件,找到了第一个文件后,继续找其它的文件,并将找到的文件或目录名显示在列表框中。

所有文件找到后,结束查询,并依次删除文件查询对象、FTP连接对象和Internet会话对象,结束会话。

此时,可以从服务器下载文件。

从列表框中选择一个文件,会产生LBN_SELCHANGE事件,自动调用相应的OnSelchangeListFile函数,禁用用来输入的文本框控件,禁用查询和上传按钮,激活下载按钮。

此时,用户可以点击‘下载’按钮,产生BN_CLICKED事件,自动调用OnDownload函数,调用Download函数,下载该文件。

下载完毕,禁用下载按钮,激活查询和上传按钮,激活用来输入的文本框控件。

而Download函数重新创建Internet会话,建立FTP连接,下载文件后,将会话对象和连接对象清除。

如果要向FTP服务器上传文件,点击“上传“按钮,产生BN_CLICKED事件,调用OnUpload函数,该函数获得当前输入的服务器名、登录用户名和口令,禁用用于输入的文本框控件,禁用查询按钮,禁用用于输入的文本框控件,弹出小对话框,获得待上传的本地机文件路径和文件名,调用Upload函数上传文件。

上传完毕,激活查询按钮,激活用于输入的文本和编辑控件。

Upload函数也重新创建Internet会话,建立FTP连接,上传文件后,然后清除会话对象和连接对象。

此程序的查询、下载和上传功能基本是独立的。

每次都要创建会话,建立连接,执行操作,然后清除对象。

此程序的主要的技术要点是:

如何创建一个Internet会话,即创建CInternetSession对象;如何建立与FTP服务器的连接,即创建CFtpConnection对象;如果连接成功,如何获得当前登录的目录下的文件和目录名称,即检索一个目录下的文件,并显示文件信息;如何下载文件、上传文件以及关闭连接。

三、实验步骤

(1)使用MFCAppWizard创建应用程序框架,工程名是Ftp,应用程序的类型是基于对话框的,其它部分接受系统的默认设置就可以,用户界面如图2所示。

应用程序包括两个类:

关于对话框类:

CAboutDlg

应用程序类:

CFtpApp,对应的文件是Ftp.h和Ftp.cpp。

对话框类:

CFtpDlg,对应的文件是FtpDlg.h和FtpDlg.cpp。

图2Ftp客户端程序的主对话框

(2)为对话框添加控件,按照表1修改控件的属性。

表1对话框中的控件属性

控件类型

控件ID

Caption

静态文本statictext

IDC_STATIC_FTP

服务器域名

静态文本statictext

IDC_STATIC_NAME

用户登录名

静态文本statictext

IDC_STATIC_PWD

登录口令

静态文本statictext

IDC_STATIC_FILE

目录文件列表

编辑框editbox

IDC_EDIT_FTP

编辑框editbox

IDC_EDIT_NAME

编辑框editbox

IDC_EDIT_PWD

命令按钮button

IDOK

查询

命令按钮button

IDC_DOWNLOAD

下载

命令按钮button

IDC_UPLOAD

上传

命令按钮button

IDCANCEL

退出

列表框listbox

IDC_LIST_FILE

(sort不选)

(3)定义控件的成员变量

按照表2,用类向导(ClassWizard)为对话框中的控件对象定义相应的成员变量。

表2控件对象的成员变量

控件ID

ControlIDs

变量名称

MemberVariableName

变量类别

Category

变量类型

VariableType

IDC_STATIC_FTP

m_staFtp

Control

CStatic

IDC_STATIC_NAME

m_staName

Control

CStatic

IDC_STATIC_PWD

m_staPwd

Control

CStatic

IDC_EDIT_FTP

m_strFtp

Value

CString

m_editFtp

Control

CEdit

IDC_EDIT_NAME

m_strName

Value

CString

m_editName

Control

CEdit

IDC_EDIT_PWD

m_strPwd

Value

CString

m_editPwd

Control

CEdit

IDOK

m_btnQuery

Control

CBotton

IDC_DOWNLOAD

m_btnDownload

Control

CBotton

IDC_UPLOAD

m_btnUpload

Control

CBotton

IDC_LIST_FILE

m_listFile

Control

CListBox

(3)添加成员变量的初始化代码

在FtpDlg.cpp文件的OnInitDialog()函数中添加成员变量的初始化代码。

对服务器名,登录用户名,登录口令的控件变量赋初值。

BOOLCFtpDlg:

:

OnInitDialog()

{

.................//前面是MFC应用程序向导和类向导自动生成的代码

//TODO:

Addextrainitializationhere

m_strFtp=_T("");//初始化服务器域名

m_strName=_T("");//初始化登录用户名

m_strPwd=_T("");//初始化登录口令

UpdateData(FALSE);//更新界面

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

}

(5)为对话框中的控件对象添加事件响应函数

按照表3,用类向导(ClassWizard)为对话框中的控件对象添加事件响应函数。

表3对话框控件的事件响应函数

控件类型

对象标识ObjectID

消息Message

函数Memberfunctions

命令按钮

IDOK

BN_CLICKED

OnQuery

命令按钮

IDC_DOWNLOAD

BN_CLICKED

OnDownload

命令按钮

IDC_UPLOAD

BN_CLICKED

OnUpload

列表框

IDC_LIST_FILE

LBN_SELCHANGE

OnSelchangeListFile

(6)为CFtpDlg类添加其它的成员函数,分别用于文件的下载和上传。

BOOLCFtpDlg:

:

Download(CStringstrSName,CStringstrDName);

BOOLCFtpDlg:

:

Upload(CStringstrSName,CStringstrDName);

(7)手工添加包含语句

在CFtpDlg类的FtpDlg.cpp文件中添加对于Afxinet.h的包含命令,来获得对于MFCWinInet类的支持。

(8)添加事件函数和成员函数的代码

附录:

主要功能实现的代码和分析

这个程序的类比较少,只需要在CFtpDlg类的FtpDlg.cpp文件中添加事件函数和成员函数的代码。

以下按照它们执行的功能分别介绍。

1.查询并显示FTP服务器的当前目录内容

当用户输入了服务器名、登录用户名和口令后,点击‘查询’按钮,会产生BN_CLICKED事件,导致执行对应的函数OnQuery()。

代码如下:

voidCFtpDlg:

:

OnQuery()

{

CInternetSession*pSession;//定义会话对象指针变量

CFtpConnection*pConnection;//定义连接对象指针变量

CFtpFileFind*pFileFind;//定义文件查询对象指针变量

CStringstrFileName;

BOOLbContinue;

pConnection=NULL;//初始化

pFileFind=NULL;

UpdateData(TRUE);//获得用户的当前输入(服务器名,用户名和口令)

while(m_listFile.GetCount()!

=0)m_listFile.DeleteString(0);//清除列表框的内容

pSession=newCInternetSession(//创建Internet会话类对象

AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);

try

{//试图建立与指定FTP服务器的连接

pConnection=

pSession->GetFtpConnection(m_strFtp,m_strName,m_strPwd);

}catch(CInternetException*e){

e->Delete();//无法建立连接,进行错误处理

pConnection=NULL;

}

if(pConnection!

=NULL)

{//创建CFtpFileFind对象,向构造函数传递CFtpConnection对象的指针

pFileFind=newCFtpFileFind(pConnection);

bContinue=pFileFind->FindFile("*");//查找服务器上当前目录的任意文件

if(!

bContinue)//如果一个文件都找不到,结束查找

{

pFileFind->Close();

pFileFind=NULL;

}

while(bContinue)//找到了第一个文件,继续找其它的文件

{

strFileName=pFileFind->GetFileName();//获得找到的文件的文件名

//如果找到的是否目录,将目录名放在括弧中

if(pFileFind->IsDirectory())strFileName="["+strFileName+"]";

//将找到的文件或目录名显示在列表框中。

m_listFile.AddString(strFileName);

bContinue=pFileFind->FindNextFile();//查找下一个文件

}

if(pFileFind!

=NULL)

{

pFileFind->Close();//结束查询

pFileFind=NULL;

}

}

deletepFileFind;//删除文件查询对象

if(pConnection!

=NULL)

{

pConnection->Close();

deletepConnection;//删除FTP连接对象

}

deletepSession;//删除Internet会话对象

}

2.实现文件下载功能

//查询以后,当用户在列表框中选择了一个文件时,执行此函数。

voidCFtpDlg:

:

OnSelchangeListFile()

{

//禁用用来输入的文本框控件

m_editFtp.EnableWindow(FALSE);//服务器域名输入文本框

m_editName.EnableWindow(FALSE);//登录用户名输入文本框

m_editPwd.EnableWindow(FALSE);//口令输入文本框

m_staFtp.EnableWindow(FALSE);

m_staName.EnableWindow(FALSE);

m_staPwd.EnableWindow(FALSE);

//禁用查询和上传按钮

m_btnUpload.EnableWindow(FALSE);//上传按钮

m_btnQuery.EnableWindow(FALSE);//查询按钮

//激活下载按钮

m_btnDownload.EnableWindow(TRUE);

}

//当用户点击“下载”按钮时,执行此函数

voidCFtpDlg:

:

OnDownload()

{

//获得当前输入

UpdateData(TRUE);

intnSel=m_listFile.GetCurSel();

CStringstrSourceName;

//获得用户在列表框中的选择

nSel=m_listFile.GetCurSel();

m_listFile.GetText(nSel,strSourceName);

if(strSourceName.GetAt(0)!

='[')

{

//选择的是文件

CStringstrDestName;

CFileDialogdlg(FALSE,"","*.*");//定义了一个文件对话框对象变量

if(dlg.DoModal()==IDOK)//激活文件对话框

{

//获得下载文件在本地机上存储的路径和名称

strDestName=dlg.GetPathName();

//调用函数下载文件

if(Download(strSourceName,strDestName))

AfxMessageBox("下载成功!

",MB_OK|MB_ICONINFORMATION);

else

AfxMessageBox("下载失败!

",MB_OK|MB_ICONSTOP);

}else{

AfxMessageBox("请写入文件名!

",MB_OK|MB_ICONSTOP);

}

}else{

//选择的是目录

AfxMessageBox("不能下载目录!

\n请重选!

",MB_OK|MB_ICONSTOP);

}

//禁用下载按钮

m_btnDownload.EnableWindow(FALSE);

//激活查询和上传按钮

m_btnUpload.EnableWindow(TRUE);

m_btnQuery.EnableWindow(TRUE);

//激活用来输入的文本和编辑框控件

m_editFtp.EnableWindow(TRUE);

m_editName.EnableWindow(TRUE);

m_editPwd.EnableWindow(TRUE);

m_staFtp.EnableWindow(TRUE);

m_staName.EnableWindow(TRUE);

m_staPwd.EnableWindow(TRUE);

}

//Download函数由OnDownload函数调用,执行实际的下载任务

BOOLCFtpDlg:

:

Download(CStringstrSName,CStringstrDName)

{

CInternetSession*pSession;//定义会话对象变量指针

CFtpConnection*pConnection;//定义连接对象变量指针

pConnection=NULL;

//创建Internet会话对象

pSession=newCInternetSession(AfxGetAppName(),1,

PRE_CONFIG_INTERNET_ACCESS);

//建立FTP连接

pConnection=pSession->GetFtpConnection(m_strFtp,

m_strName,m_strPwd);

if(pConnection!

=NULL)

{

//下载文件

if(!

pConnection->GetFile(strSName,strDName))

{

//下载文件错误

pConnection->Close();

deletepConnection;

deletepSession;

returnFALSE;

}

}

//清除对象

if(pConnection!

=NULL)

{

pConnection->Close();

deletepConnection;

}

deletepSession;

returnTRUE;

}

3.实现文件上传功能

//当用户点击“上传”按钮时,执行此函数

voidCFtpDlg:

:

OnUpload()

{

//获得当前输入

UpdateData(TRUE);

//禁用用于输入的文本框控件

m_editFtp.EnableWindow(FALSE);//服务器域名输入文本框

m_editName.EnableWindow(FALSE);//登录客户名输入文本框

m_editPwd.EnableWindow(FALSE);//口令输入文本框

m_staFtp.EnableWindow(FALSE);

m_staName.EnableWindow(FALSE);

m_staPwd.EnableWindow(FALSE);

//禁用查询按钮

m_btnQuery.EnableWindow(FALSE);

CStringstrSourceName;

CStringstrDestName;

CFileDialogdlg(TRUE,"","*.*");//定义文本对话框对象变量

if(dlg.DoModal()==IDOK)

{

//获得待上传的本地机文件路径和文件名

strSourceName=dlg.GetPathName();

strDestName=dlg.GetFileName();

//调用Upload函数上传文件

if(Upload(strSourceName,strDestName))

AfxMessageBox("上传成功!

",MB_OK|MB_ICONINFORMATION);

else

AfxMessageBox("上传失败!

",MB_OK|MB_ICONSTOP);

}else{

//文件选择有错误

AfxMessageBox("请选择文件!

",MB_OK|MB_ICONSTOP);

}

//激活查询按钮

m_btnQuery.EnableWindow(TRUE);

//激活用于输入的文本框控件

m_editFtp.EnableWindow(TRUE);

m_editName.EnableWindow(TRUE);

m_editPwd.EnableWindow(TRUE);

m_staFtp.EnableWindow(TRUE);

m_staName.EnableWindow(TRUE);

m_staPwd.EnableWindow(TRUE);

}

//Upload函数有事件处理函数OnUpload调用,执行实际的上传任务

BOOLCFtpDlg:

:

Upload(CStringstrSName,CStringstrDName)

{

CInternetSession*pSession;

CFtpConnection*pConnection;

pConnection=NULL;

//创建Internet会话

pSession=newCInternetSession(AfxGetAppName(),1,

PRE_CONFIG_INTERNET_ACCESS);

try

{

//建立FTP连接

pConnection=pSession->GetFtpConnection(m_strFtp,

m_strName,m_strPwd);

}

catch(CInternetException*e)

{

//错误处理

e->Delete();

pConnection=NULL;

returnFALSE;

}

if(pConnection!

=NULL)

{

//上传文件

if(!

pConnection->PutFile(strSName,strDName))

{

//上传文件错误

pConnection->Close();

deletepConnection;

deletepSession;

returnFALSE;

}

}

//清除对象

if(pConnection!

=NULL)

{

pConnection->Close();

deletepConnection;

}

deletepSession;

returnTRUE;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1