网络程序设计文档格式.docx
- 文档编号:22937147
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:37
- 大小:1.95MB
网络程序设计文档格式.docx
《网络程序设计文档格式.docx》由会员分享,可在线阅读,更多相关《网络程序设计文档格式.docx(37页珍藏版)》请在冰豆网上搜索。
B.利用CInternetSession类的QueryOption或SetOption成员函数,可以查询或设置该类内涵的Internet请求选项,这一步是可选的,不需要可以不做。
C.创建连接类对象,建立CInternetSession对象与网络服务器的连接,也就是应用程序与网络服务器的连接。
需要调用CInternetSession类的GetFtpConnection、GetHttpConnection或GetGopherConnection函数。
D.创建文件检索类对象,对服务器进行检索。
E.如果需要使用异步操作模式,可以重载CInternetSession类的OnStatueCallback函数,并启动应用程序使用状态回调机制,重载相关函数,加入自己的代码。
F.如果还想更紧密的控制对于服务器文件的访问,可以进一步创建文件类对象实例,完成文件查找或文件读写操作。
G.创建CInternetException类对象实例,处理错误。
H.关闭各种类,将资源释放给系统。
程序设计流程图
总体流程图
查询流程图
上传流程图
下载流程图
Ftp客户端详细设计
创建在本机创建Ftp服务器
1.控制面板->
程序。
2.选择打开或关闭Window功能,如图勾选Ftp服务器。
3.控制面板->
系统和安全->
管理工具。
4.选择Internet信息服务(IIS)管理器,右键->
网站->
添加FTP站点。
5.如图填写。
6.如图填写。
7.如图填写
Ftp客户端设计
1.使用MFCAppWizard创建应用程序框架
工程名是Ftp,应用程序的类型是基于对话框的,其它部分接受系统的默认设置就可以。
应用程序包括两个类:
应用程序类:
CFtpApp,对应的文件是Ftp.h和Ftp.cpp。
对话框类:
CFtpDlg,对应的文件是FtpDlg.h和FtpDlg.cpp。
2.对话框界面设计。
如图A
图A
3.为对话框添加控件
在程序的主对话框界面中按照图添加相应的可视控件对象,并按照表6.13修改控件的属性。
表6.13对话框中的控件属性
控件类型
控件ID
Caption
静态文本statictext
IDC_STATIC_FTP
服务器域名
IDC_STATIC_NAME
用户登录名
IDC_STATIC_PWD
登录口令
IDC_STATIC_FILE
编辑框editbox
IDC_EDIT_FTP
IDC_EDIT_NAME
IDC_EDIT_PWD
命令按钮button
IDOK
查询
IDC_DOWNLOAD
下载
IDC_UPLOAD
上传
IDCANCLE
退出
IDC_CONNECT
连接
IDC_DISCONNECT
断开
列表框listbox
IDC_LIST_FILE
(sort不选)
4.定义控件的成员变量
按照表6.14,用类向导(ClassWizard)为对话框中的控件对象定义相应的成员变量。
表6.14控件对象的成员变量
ControlIDs
变量名称
MemberVariableName
变量类别
Category
变量类型
VariableType
m_staFtp
Control
CStatic
m_staName
m_staPwd
m_strFtp
Value
CString
m_editFtp
CEdit
m_strName
m_editName
m_strPwd
m_editPwd
m_btnQuery
CBotton
m_btnDownload
m_btnUpload
m_listFile
CListBox
5.添加成员变量的初始化代码
在FtpDlg.cpp文件的OnInitDialog()函数中添加成员变量的初始化代码。
对服务器名,登录用户名,登录口令的控件变量赋初值。
BOOLCFtpDlg:
:
OnInitDialog()
{
.................//前面是MFC应用程序向导和类向导自动生成的代码
//TODO:
Addextrainitializationhere
m_strFtp=_T("
"
);
//初始化服务器域名
m_strName=_T("
//初始化登录用户名
m_strPwd=_T("
//初始化登录口令
UpdateData(FALSE);
//更新界面
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
}
6.为对话框中的控件对象添加事件响应函数
按照表6.15,用类向导(ClassWizard)为对话框中的控件对象添加事件响应函数。
表6.15对话框控件的事件响应函数
对象标识ObjectID
消息Message
函数Memberfunctions
命令按钮
BN_CLICKED
OnQuery
OnDownload
OnUpload
OnConnect
OnDisconnect
列表框
LBN_SELCHANGE
OnSelchangeListFile
LBN_DBLCLK
OnDblclkListFile
7.为CFtpDlg类添加其它的成员函数和成员变量。
Download(CStringstrSName,CStringstrDName);
Upload(CStringstrSName,CStringstrDName);
分别用于文件的下载和上传。
CInternetSession*pSession;
//定义会话对象指针变量
CFtpConnection*pConnection;
//定义连接对象指针变量
分别用于建立会话和Ftp连接。
作为对话框类的成员变量。
和对话框具有相同的生命周期。
另外通过新添加的两个连接和断开按钮。
使得控制更加合理。
这是对原有程序的改进之一。
8.手工添加包含语句
在CFtpDlg类的FtpDlg.cpp文件中添加对于Afxinet.h的包含命令,来获得对于MFCWinInet类的支持。
9.进行测试
在上面建立的Ftp服务器文件夹中放入文件或文件夹,运行即可。
源程序不足及现有程序改进
原有程序不足:
1.首先源程序是不能运行的。
需要将下面一段代码中
bContinue=pFileFind->
FindNextFile();
提到
strFileName=pFileFind->
GetFileName();
之前。
因为GetFileName()函数必须在FindNextFile()执行过之后才能获得文件的文件名。
修改过之后可以运行。
while(bContinue)//找到了第一个文件,继续找其它的文件
//获得找到的文件的文件名
//如果找到的是否目录,将目录名放在括弧中
if(pFileFind->
IsDirectory())strFileName="
["
+strFileName+"
]"
;
//将找到的文件或目录名显示在列表框中。
m_listFile.AddString(strFileName);
//查找下一个文件
2.原程序的操作非常不人性化。
没有连接和断开按钮,给人以误导。
图一是输入域名192.168.1.102域名(本机Ftp服务器域名)后点击查询的结果。
此时可以上传文件。
但不能下载,但选择目录中的任意一个文件时,如图二所示。
此时只有下载和退出可以使用。
如果要想再次上传,只能重新运行程序。
图一
图二
3.注意图二中目录文件列表的第三行有个【新建文件夹】,这是个文件夹,在这个程序中是无法浏览并下载文件夹中的内容的。
这也是非常不好的Bug。
现有程序的改进:
1.在原有程序的基础上添加了连接和断开按钮。
分别进行连接Ftp和断开Ftp。
点击连接按钮如图三、四。
图三
图四
2.这时可以进行上传文件操作,和任意选择文件进行下载。
但选中某一文件时。
如图五所示。
所有按钮都可以使用。
但是上面的编辑框只有在断开连接后才可以使用。
图五
3.这次程序最大的改进我认为是在浏览文件时在不同目录之间的跳转,双击图五中新建文件集目录后进入新建文件夹目录并显示文件。
如图六所示。
注意目录列表的第一行。
这是为返回上级目录设计的,这也符合大众的使用习惯。
当双击“/新建文件夹”之后,即可返回如图五的界面。
图六
主要功能实现和代码分析
A.首先在CFtpDlg.h文件中添加
CInternetSession*pSession;
CFtpConnection*pConnection;
在对话框类中添加这两个指针变量。
用来建立会话和Ftp连接,这时这两个指针和对话框具有相同的生命周期。
在点击退出按钮时释放指针。
之前程序是把这两个指针变量放在函数执行时定义并在函数结束时释放。
显得麻烦和冗余。
B.在CFtpDlg类的FtpDlg.cpp文件中添加事件函数和成员函数的代码。
以下按照它们执行的功能分别介绍。
1.点击连接按钮响应函数OnConnect()。
voidCFtpDlg:
OnConnect()
//TODO:
Addyourcontrolnotificationhandlercodehere
pConnection=NULL;
//初始化
UpdateData(TRUE);
//获得用户的当前输入(服务器名,用户名和口令)
while(m_listFile.GetCount()!
=0)
m_listFile.DeleteString(0);
//清除列表框的内容
pSession=newCInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);
//创建Internet会话类对象
try
{//试图建立与指定FTP服务器的连接
pConnection=pSession->
GetFtpConnection(m_strFtp,m_strName,m_strPwd);
AfxMessageBox("
连接成功!
m_editFtp.EnableWindow(FALSE);
//服务器域名输入文本框
m_editName.EnableWindow(FALSE);
//登录用户名输入文本框
m_editPwd.EnableWindow(FALSE);
//口令输入文本框
//禁用查询和上传按钮
m_btnUpload.EnableWindow(TRUE);
//上传按钮
m_btnQuery.EnableWindow(TRUE);
//查询按钮
//激活下载按钮
m_btnDownload.EnableWindow(TRUE);
//下载按钮
OnQuery();
//显示根目录下内容
}
catch(CInternetException*e)
{
e->
Delete();
//无法建立连接,进行错误处理
pConnection=NULL;
连接失败!
}
2.点击断开按钮响应函数OnDisconnect()。
OnDisconnect()
if(pConnection!
=NULL)
{
pConnection->
Close();
//关闭与ftp服务器之间的连接
if(pSession!
pSession->
//关闭会话对象
AfxMessageBox("
连接断开"
if(m_listFile.GetCount()!
=0)
while(m_listFile.GetCount()!
m_listFile.DeleteString(0);
//清除列表框的内容
m_editFtp.EnableWindow(TRUE);
//服务器域名输入文本框
m_editName.EnableWindow(TRUE);
m_editPwd.EnableWindow(TRUE);
//口令输入文本框
m_btnUpload.EnableWindow(FALSE);
//上传按钮
m_btnQuery.EnableWindow(FALSE);
m_btnDownload.EnableWindow(FALSE);
3.点击查询按钮响应函数OnQuery()。
OnQuery()
CFtpFileFind*pFileFind;
//定义文件查询对象指针变量
CStringstrFileName;
//保存文件名
CStringCurrentPath;
//当前路径字符串
BOOLbContinue;
//循环控制变量
pFileFind=NULL;
//清除列表框的内容
pConnection->
GetCurrentDirectory(CurrentPath);
m_listFile.InsertString(0,CurrentPath);
//插入上级目录字符串
//创建CFtpFileFind对象,向构造函数传递CFtpConnection对象的指针
pFileFind=newCFtpFileFind(pConnection);
//查找服务器上当前目录的任意文件
bContinue=pFileFind->
FindFile("
*"
if(!
bContinue)//如果一个文件都找不到,结束查找
{
pFileFind->
pFileFind=NULL;
}
while(bContinue)//找到了第一个文件,继续找其它的文件
bContinue=pFileFind->
//查找下一个文件
//获得找到的文件的文件名
strFileName=pFileFind->
//如果找到的是否目录,将目录名放在括弧中
if(pFileFind->
IsDirectory())
strFileName="
m_listFile.AddString(strFileName);
if(pFileFind!
//结束查询
deletepFileFind;
//删除文件查询对象
4.点击下载按钮响应函数OnDownload()。
OnDownload()
//获得当前输入
intnSel=m_listFile.GetCurSel();
//保存所选项索引
CStringstrSourceName;
//保存用户在列表框中的选择
nSel=m_listFile.GetCurSel();
//获得所选项索引
if(nSel==-1)
请选择要下载的文件!
return;
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
请写入文件名!
else
//选择的是目录
不能下载目录!
\n请重选!
//禁用下载按钮
//激活查询和上传按钮
m_btnUpload.EnableWindow(TRUE);
m_btnQuery.EnableWindow(TRUE);
//Download函数由OnDownload函数调用,执行实际的下载任务
Download(CStringstrSName,CStringstrDName)
//将服务器中指定文件下载为本地文件
pConnection->
GetFile(strSName,strDName))
//下载文件错误
pConnection->
returnFALSE;
returnTRUE;
5.点击上传按钮响应函数OnUpload()。
OnUpload()
CStringstrDestName;
CFileDialogdlg(T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络程序设计