网络程序设计考试基于FTP协议的网络文件传输Word文档格式.docx
《网络程序设计考试基于FTP协议的网络文件传输Word文档格式.docx》由会员分享,可在线阅读,更多相关《网络程序设计考试基于FTP协议的网络文件传输Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
FTP编程基础
3.FTP传输原理
FTP协议使用两条单独的TCP连接,一条专用于发送FTP命令,另一条则专用于传递数据。
初始建立连接时,服务器在21号端口上接收来自客户端的命令连接。
当需要传送数据时(文件列表、文件数据等),客户端向服务器发出Port命令,并进入监听状态,等待来自服务器的数据连接请求。
连接到FTP服务器,首先需要创建一个CInternetSession对象,用类CInterSession创建并初始化一个或几个同时存在的Internet会话,并描述与代理服务器的连接,如果在程序运行期间需要保持与Internet的连接,可以创建一个CInternetSession对象作为类CWinApp的成员。
MFC中的类CFtpConnection管理与Internet服务器的连接,并直接操作服务器上的目录和文件,FTP是MFC的WinInet支持的三个Internet功能之一,创建一个CInternetSession实例和一个CFtpConnection对象就可以实现和一个FTP服务器通信,不需要直接创建CFtpConnection对象,而是通过调用CInternetSession:
:
GetFtpConnection来完成这项工作。
它创建CFtpConnection对象并返回一个指向该对象的指针。
实验环境:
本次实验采用MFC工程,工程采用MFC对话框界面,工程名称为Ftp,生成的类有CFtpApp类和CFtpDlg类。
函数的描述:
1.控件与变量的关联表:
DDX_Control(pDX,IDC_UPLOAD,m_btnUpload);
DDX_Control(pDX,IDC_DOWNLOAD,m_btnDownload);
DDX_Control(pDX,IDOK,m_btnQuery);
DDX_Control(pDX,IDC_LIST_FILE,m_listFile);
DDX_Control(pDX,IDC_EDIT_PWD,m_editPwd);
DDX_Control(pDX,IDC_EDIT_NAME,m_editName);
DDX_Control(pDX,IDC_EDIT_FTP,m_editFtp);
DDX_Text(pDX,IDC_EDIT_FTP,m_strFtp);
DDX_Text(pDX,IDC_EDIT_NAME,m_strName);
DDX_Text(pDX,IDC_EDIT_PWD,m_strPwd);
主要程序源代码
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!
//结束查询
deletepFileFind;
//删除文件查询对象
pConnection->
deletepConnection;
//删除FTP连接对象
deletepSession;
//删除Internet会话对象
}
OnDownload()//下载响应函数
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
下载失败!
MB_OK|MB_ICONSTOP);
else
AfxMessageBox("
请写入文件名!
Else
//选择的是目录
AfxMessageBox("
不能下载目录!
请重选!
//控件是否可用的处理
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);
BOOLCFtpDlg:
Download(CStringstrSName,CStringstrDName)//下载响应函数
//定义会话对象变量指针
//定义连接对象变量指针
//创建Internet会话对象
pSession=newCInternetSession(AfxGetAppName(),1,
PRE_CONFIG_INTERNET_ACCESS);
try
//建立FTP连接
GetFtpConnection(m_strFtp,
m_strName,m_strPwd);
catch(CInternetException*e)
//错误处理
returnFALSE;
//下载文件
pConnection->
GetFile(strSName,strDName))
//下载文件错误
pConnection->
deletepConnection;
deletepSession;
returnFALSE;
deletepSession;
returnTRUE;
OnUpload()//上传响应函数
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);
CStringstrDestName;
CFileDialogdlg(TRUE,"
//定义文本对话框对象变量
if(dlg.DoModal()==IDOK)
//获得待上传的本地机文件路径和文件名
strSourceName=dlg.GetPathName();
strDestName=dlg.GetFileName();
//调用Upload函数上传文件
if(Upload(strSourceName,strDestName))
上传成功!
else
上传失败!
}else{
//文件选择有错误
请选择文件!
程序运行结果:
1.登录学校的ftp服务器运行查询后结果
2.运行下载后结果
3.由于服务器限制,不可上传文件,未能进行测试。
总结:
刚开始接触网络编程时,里面复杂的函数名称和生疏的原函数模型使得对程序学的学习很是迷茫,经常去想那些复杂的代码代表的都是什么意思,其实那些只是一个名称,知道如何使用就行了,慢慢可以开始揣度教材的程序,试着编写接下面的内容,通过不断的编译和运行,对于许多的错误的检测,做多种可能的尝试改动之后,继而得到的正确结果,反过来思考整个程序的运行流程,在不断的更正中使自己不断地提高。
当然,这份成果也离不开老师和同学的帮助和支持,在这里着重地表示感谢.