文档库

最新最全的文档下载
当前位置:文档库 > ftp客户端的设计

ftp客户端的设计

ftp客户端的设计

目录

1 绪论 (1)

1.1 研究背景 (1)

1.2 主要工作 (1)

1.3 本文结构 (1)

2 相关知识介绍 (2)

2.1 FTP 工作原理 (2)

2.2 FTP工作模式 (2)

2.3 FTP 传输模式 (4)

2.3.1 ASCII传输方式 (4)

2.3.2 二进制传输方式 (4)

3 FTP客户端的设计 (4)

3.1设计目的及工具选择 (4)

3.1.1 设计目的 (4)

3.1.2 设计工具 (5)

3.2 客户端主要模块设计 (5)

3.2.1 客户端连接模块 (5)

3.2.2 上传模块 (7)

3.2.3 下载模块 (9)

4 调试与操作说明 (11)

4.1 运行方法 (11)

4.2运行结果 (11)

5 课程设计总结与体会 (14)

参考文献 (15)

附录 (16)

致谢 (27)

FTP客户端的设计与实现

FTP 是Internet 上用来传送文件的协议。它是为了我们能够在Internet 上互相传送文件而制定的文件传送标准,规定了Internet 上文件如何传送。通过FTP 协议,我们就可以跟Internet 上的FTP 服务器进行文件的上传或下载。本文以实现一个简单易用的FTP 客户端为目标,通过分析FTP 协议的基本工作原理和FTP 的数据传输原理,研究如何使用C++ 工具对FTP 客户端进行设计,选择C++来实现FTP 客户端程序的上传下载等主要功能,并用相应软件提供的一个支持可视化编程的开发环境,从而实现了对FTP 客户端的实现。

1 绪论

1.1 研究背景

FTP是Internet上最早也是最广的应用,直到今天它仍是最重要和最基本的应用之一。用FTP将信息下载到本地是一件十分普遍的事。也随之出现了许多下载软件。尽管远程

登录(Telnet)提供了访问远程文件的极好方法,但怎么也比不上使用自己计算机中的文件

方便。如果用户想使用其它计算机上的文件,最理想的方法就是把它COPY到自己的计算机中,以便在本地计算机上操作。FTP正是完成这项工作的工具,你可以在任意一个经过文件

传输协议(FTP)访问的公共有效的联机数据库或文档中找到你想要的任何东西。全世界现

在已有1000多个(96年的数据)FTP文件服务器对所有INTERNET用户开使用,用户可以通

过与Internet相连到远程计算机,把自己需要的文件传输过来或是把自己的收集传输上去

与他人共享。传统的数据库应用系统采用的是客户机/服务器(Client/Server)模式,有高度

的交互性,高效的用户界面等优点

1.2 主要工作

通过客户端可以实现文件的上传和下载。其促进文件的共享(计算机程序或数据)、鼓

励间接或者隐式的使用远程计算机、向用户屏蔽不同主机中各种文件存储系统的细节和可靠

和高效的传输数据。

1.3 本文结构

本文第1部分绪论主要说明了研究背景、主要工作和本文结构。第2部分说明了有关ftp的相关知识。第三部分系统设计,绘制了系统的模块图、流程图和模块的实现。第四部

分系统的测试与数据分析,说明了测试遇到的问题、解决方法及系统进一步的优化。第五部

分是本课程设计的总结和体会。

2 相关知识介绍

2.1 FTP 工作原理

FTP(File Transfer Protocol),是文件传输协议的简称。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序。用户可以通过它把自己机器与世界各地所有运FTP协议的服务器相连,访问服务器上的资源和信息。

FTP协议在TCP/IP协议栈中的位置如表1:

ftp客户端的设计

当启动FTP从远程计算机拷贝文件时,事实上启动了两个程序:一个本地机器上的FTP 客户端程序,它向FTP服务器提出拷贝文件的请求。另一个是启动在远程计算机的上的FTP 服务器程序,它响应请求把你指定的文件传送到你的计算机中。FTP采用“客户端/服务器”方式,用户要在自己的本地计算机上安装FTP客户端程序。从根本上说,FTP协议就是在网络中各种不同的计算机之间按照TCP/IP协议来传输文件。FTP协议采用客户端/服务器(Client/Sever)模式,由FTP客户端程序和FTP服务器端程序组成。使用时,先启动FTP客户端程序与远程主机建立连接,然后向远程主机发出传输命令,远程主机在收到命令后就给予响应,并执行正确的命令。但是FTP有一个根本的限制,那就是,如果用户在某个主机上没有注册获得授权,即没有用户名和口令,就不能与该主机进行文件传输。但匿名FTP服务器除外,它能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。用户使用特殊的用户名“Anonymous”或“guest”就可有限制地访问远程主机上公开的文件。现在许多系统要求用户将Emai1地址作为口令,以便更好地对访问者进行跟综。出于安全的目的,大部分匿名FTP主机一般只允许远程用户下载文件,而不允许上载文件。也就是说,用户只能从匿名FTP主机拷贝其需要的文件而不能把文件拷贝到匿名FTP主机。另外,匿名FTP主机还采用了其他一些保护措施以保护自己的文件不至于被用户修改和删除,并防止计算机病毒的侵入。匿名FTP一直是Internet上获取信息资源的最主要方式,在Internet成千上万的匿名FTP主机中存储着无以计数的文件,这些文件包含了各种各样的信息、数据和软件。人们只要知道特定信息资源的主机地址,就可以用匿名FTP登陆。

2.2 FTP工作模式

FTP 采用C/S(客户端/服务器)模式进行通信,但与其他的C/S 模式网络通信协议又有一个很大的区别。通常在进行HTTP 通信或是TELNET 通信的时候,只需要一个端口进行通信。

即客户端只需要连接一个端口进行数据通信。如TELNET 的默认端口是23,用户从头到尾都只需使用这个端口。但是FTP 通信除了有一个默认端口21 之外,还需要其他的端口。其中默认端口(21)主要进行控制连接,进行命令协议和服务器端的响应码的传输;另外一个非标准端口主要进行数据传递,如文件的上载、下载等。至于非标准端口的产生则要根据用户选择的连接模式而定:如果客户选择的是主动模式(PORT),则需要用户端提供给服务器一个IP 地址和一个非标准端口;而如果用户采用被动模式(PASV),则服务器端需要提供给客户端一个IP 地址和一个非标准端口。下表是几个著名的TCP 端口号:

表2 TCP 端口号

ftp客户端的设计

FTP 中字节大小有两个:逻辑字节大小和用于传输的字节大小。后者通常是8 位,而前者可不一定是多少了。传输字节不必等于逻辑字节大小,也不必对数据结构进行解释。控制连接是建立在USER-PIT 和SERVER-PI 之间用于交换命令与应答的通信链路。数据连接是传输数据的全双工连接,传输数据可以发生在服务器DTP 和用户DTP之间也可以发生在两个服务器DTP 之间,FTP 可以传输非连续的文件,这些文件的一部分称为页。服务器DTP 代表一种传输过程,它通常处于“主动”状态,它和侦听端口建立数据连接,它还可以为传输和存储设置参数,并根据PI 的指令传输数据。当然,DTP 也可以转入“被动”状态。服务器FTP 进程,它是和用户FTP 进程一起工作的,它由PI 和DTP 组成。在开始阶段,标准FTP 命令由用户PI 产生并通过控制连接传送到服务器进程。服务器PI 向用户PI 返回标准应答。FTP 命令指定数据连接参数和文件系统操作。用户DTP 在特定数据端口侦听,服务器开始数据连接并以指定的参数开始数据传输。数据端口不必在开始FTP 命令的机器上,但用户或用户FTP 进程必须确定它在指定的数据端口上侦听.这个数据连接是全双工的。

2.3 FTP 传输模式

FTP 协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、联接的方式、甚至是是否使用相同的操作系统无关。假设两台计算机通过ftp 协议对话,并且能访问Internet,你可以用ftp 命令来传输文件。每种操作系统使用上有某一些细微差别,但是每种协议基本的命令结构是相同的。FTP的传输有两种方式:ASCII传输模式和二进制数据传输模式。

2.3.1 ASCII传输方式

假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝,不要对这些文件进行处理。

2.3.2 二进制传输方式

在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢,也会损坏数据,使文件变得不能用。

3 FTP客户端的设计

3.1设计目的及工具选择

3.1.1 设计目的

FTP 早已应用在网络的各个方面,比如我们在访问网络上的资源时,经常会遇到需要连接FTP 服务器来下载,或者你制作了一个网站,想要将其上传至服务器,让大家能够访问它,这个时候就会用到FTP 客户端。

虽然平时使用windows 自带的IE 浏览器即可实现对FTP 服务器的访问,但是IE 只是个很粗糙的FTP 客户端。IE 浏览器在6.0 以下的版本不支持PASV 方式访问服务器,而且IE 浏览器在登录FTP 服务器的时候,无法查看返回的信息,在出错的时候,无法找到错误的原因,因此在使用上很不方便。

现在大多数的FTP 客户端软件都是收费版的,而且以英文版居多,使用上操作很复杂,

目前流行的有CoreFtp、AceFtp 、Ftp Voyager 等,但是大多数用户并不习惯使用这些软件。

本文所设计的FTP 客户端则适合大多数用户使用,界面设计的很简单,使用户可以一目了然,而且具备FTP 客户端的基本功能,可以作为下载、上传文件的工具来使用。

3.1.2 设计工具

程序设计中用到的主要工具就是C++,C++是一种面向对象的新一代网络编程语言,它可以在各种不同的机器、操作系统的网络环境中进行开发,具有解释型语言(如Basic语言)和编译型语言(如C语言)的特性。 C++中各种利大于弊的功能和许多很少用到的功能,用C++开发的程序可以在网络上传输,并运行于任何客户机上。

使用C++语言可以方便的设计出网络应用类的程序,而且C++的移植性很好,在、其应用程序在各种机器上都能无差别的执行。

为了使FTP客户端能适应大多数平台下的使用,我选择使用C++语言来实现。

3.2 客户端主要模块设计

3.2.1 客户端连接模块

运行客户端后,首先是连接服务器,需要输入服务器IP 地址,用户名和密码,然后点击连接,观察是否连接成功,若成功则显示远程文件的列表。

若连接失败,则抛出异常,弹出对话框显示出错误,可知如何修改,然后重新输入服务器IP 地址或用户名或密码,直到连接上服务器。下图为客户端连接流程图:

ftp客户端的设计

图3-1 客户端连接流程图

服务器模块的主要代码为:

void CMyFtpDlg::OnConnect()

{

UpdateData(TRUE);

//新建对话

m_pInetSession=new

CInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);

try

{

//新建连接对象

m_pFtpConnection=m_pInetSession->GetFtpConnection(m_strServer,m_strUserName ,

m_strPassword);

}

catch(CInternetException *pEx)

{

//获取错误

TCHAR szError[1024];

if(pEx->GetErrorMessage(szError,1024))

AfxMessageBox(szError);

else

AfxMessageBox("There was an exception");

pEx->Delete();

m_pFtpConnection=NULL;

return;

}

m_pRemoteFinder = new CFtpFileFind(m_pFtpConnection);

//获得服务器根目录的所有文件并在列表框中显示

BrowseDir("",&m_ctrlRemoteFiles,m_pRemoteFinder,&m_arrRemoteFiles);

}

3.2.2 上传模块

用户在连接上服务器后,可以在本地列表中选择需要上传的文件,并指定上传位置,将本机上的文件上传至FTP 服务器。

不能选择文件夹,只能选择文件。若上传失败,则抛出异常;如果成功上传,则提示上传成功。并通过断开与远程服务器的连接。下图为上传子模块流程图:

ftp客户端的设计

图3-2上传模块流程图

上传模块的主要代码为:

void CMyFtpDlg::UpFile(FILEITEM fileItem)

{

if(fileItem.bDir == TRUE)

{

AfxMessageBox("本程序暂时不支持上载整个文件夹,请选择文件上载");

}

else

{

AfxMessageBox("test");

//格式化文件名

CString strLocalFile,strRemoteFile;

strRemoteFile.Format("%s\\%s",m_pRemoteFinder->GetRoot(),fileItem.strFileNa me);

strLocalFile.Format("%s\\%s",m_LocalFinder.GetRoot(),fileItem.strFileName);

//上传

if(m_pFtpConnection->GetFile(strLocalFile,strRemoteFile))

{

CString strMsg;

strMsg.Format("上载文件%s成功!",fileItem.strFileName);

AfxMessageBox(strMsg);

}

}

}

3.2.3 下载模块

当用户在服务器文件列表中选择想要下载的文件后,选择需要下载文件在本机上的存储位置,设置上传模式为被动模式;将服务器上的文件下载至本机,如果成功下载,则提示下载成功,若失败则抛出异常,此过程可连续进行直到想退出。下图为下载子模块流程图:

ftp客户端的设计

图3-2 下载模块流程图下载模块的主要代码:

void CMyFtpDlg::DownFile(FILEITEM fileItem) {

if(fileItem.bDir == TRUE)

{

AfxMessageBox("本程序暂时不支持下载整个文件夹,请选择文件下载");

}

else

{

//格式化文件名

CString strLocalFile,strRemoteFile;

strRemoteFile.Format("%s\\%s",m_pRemoteFinder->GetRoot(),fileItem.strFileNa me);

strLocalFile.Format("%s\\%s",m_LocalFinder.GetRoot(),fileItem.strFileName);

//下载

if(m_pFtpConnection->GetFile(strRemoteFile,strLocalFile))

{

CString strMsg;

strMsg.Format("下载文件%s成功!",fileItem.strFileName);

AfxMessageBox(strMsg);

}

}

}

4 调试与操作说明

4.1 运行方法

在程序中输入服务器的IP、用户名、和密码,点击“连接”按钮即可等待连接服务器。然后可选择本地文件上传到服务器或选择远程文件下载到本地。Upload和Download分别为上传、下载按钮。

4.2运行结果

FTP服务器连接前和连接后,此过程要正确的输入服务器IP 地址,用户名和密码,本地文件栏的文件为本机C盘的内容,连接成功后在远程文件栏会出现服务器上的文件,则也标志着连接成功:

ftp客户端的设计

图4-1 ftp服务器连接前

ftp客户端的设计

图4-2 ftp服务器连接后

如果未选择文件就会弹出对话框,“请选择要上传的文件”,如果想选择文件可先选中文件夹,后点击“下一层”来选择:

ftp客户端的设计

图4 -3 选择文件夹

ftp客户端的设计

图4-4 选择下一层文件

选择文件后,点击Upload或Download即可实现上传和下载,上传或下载的文件都可在远程文件或本地文件里查找到,如果上传或下载成功会有提示:

ftp客户端的设计

图4-5 上传和下载

5 课程设计总结与体会

在指导老师的监督下,经过查找各种资料和以学到的知识,通过紧张的设计与开发,我们的课程设计——FTP客户端的设计与实现终于完成了,虽然该系统功能上还有很多的不足,但通过我们的共同钻研,设计模块,解决开发过程中遇到的各种困难,最后实现了该系统的基本功能。次操作页面简洁易懂;此系统实现了远程登录服务器、浏览本地与服务器目录文件等功能需求,从而实现了一个简易的FTP客户端软件。通过我们自己实际设计一个FTP客户端软件,使我们了解了FTP的发展历史以及工作原理,对FTP协议在网络中的结构和本身协议在传输的作用有了更深的认识。通过系统的实现,我们又了解了软件实现的理论知识,理解了实现的概念,了解了实现的方法以及过程,虽然只是有限的尝试和使用,但都会对以后做类似的项目起到了积极的指导作用。同样通过这次的课程设计,对FTP这种大型的设计,我们都发现了自己在学习上的不足,认识到了知识的重要性,体会到只有不断的充实自己,不断的挑战自己,才能获得更好的收获。在此同时我们同样认识到了团队合作的重要性。

在整个课程设计过程中,指导老师为我们讲解了这次课题的基本要求和实现的功能,推

荐我们参考书学习,鼓励我们,同时使我们明确了方向,给了我们足够的信心。谢谢老师给的建议和指导

参考文献

[1] 谢希仁.计算机网络(第五版)[M].北京:电子工业出版社,2008:232—23.

[2] 程国君.计算机网络实验教程 [M]北京:清华大学出版社,2008:79—104.

[3] 黄嘉辉.Visual http://www.wendangku.net/doc/fa9780a4551810a6f52486ed.html网络程序设计 [M]北京:清华大学出版社,2003:17—268

[4] 吴光明.使用http://www.wendangku.net/doc/fa9780a4551810a6f52486ed.html开发FTP客户端应用程序 [J].河北理工学院学报,2005:59—64

[5] http://www.wendangku.net/doc/fa9780a4551810a6f52486ed.html/view/9dac2dda50e2524de5187eb6.html

[6] http://www.wendangku.net/doc/fa9780a4551810a6f52486ed.html/p-77040568918.html

附录

核心代码:

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CMyFtpDlg dialog

CMyFtpDlg::CMyFtpDlg(CWnd* pParent /*=NULL*/)

: CDialog(CMyFtpDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CMyFtpDlg)

m_strPassword = _T("");

m_strServer = _T("");

m_strUserName = _T("");

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

m_pInetSession = NULL;

m_pFtpConnection = NULL;

m_pRemoteFinder = NULL;

m_strLocalParentRoot = m_strRemoteParentRoot = "";

}

void CMyFtpDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CMyFtpDlg)

DDX_Control(pDX, IDC_LIST_REMOTE, m_ctrlRemoteFiles);

DDX_Control(pDX, IDC_LIST_LOCAL, m_ctrlLocalFiles);

DDX_Text(pDX, IDC_PASSWORD, m_strPassword);

DDX_Text(pDX, IDC_SERVER, m_strServer);

DDX_Text(pDX, IDC_USER, m_strUserName);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CMyFtpDlg, CDialog)

//{{AFX_MSG_MAP(CMyFtpDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_CONNECT, OnConnect)