1、基于C#的FTP客户端实现目 录摘要 1引言 11. FTP 协议分析 .11.1. FTP 的工作原理 .11.2. FTP 工作模式 .21.3. FTP 传输模式 .42. FTP 客户端总体设计 .52.1. 设计目的及开发环境 52.1.1. 设计目的与.NET 环境简介 .52.1.3. FtpWebRequest 类 62.2. 系统 UML 分析 62.2.1. FTP 客户端用例图 .62.2.2. FTP 客户端主要序列图与活动图 .82.2.4. FTP 客户端类图 .122.3. 系统功能模块 152.3.1. 系统整体框架图 152.3.2. 客户端功能模块 152.
2、3.3. 客户端界面设计 162.4. 数据流程图 192.4.1. 客户端连接流程图 192.4.2. 上传子模块流程图 212.4.3. 下载子模块流程图 223. FTP 客户端程序实现 .233.1. WPF 界面设计 .233.1.1. 首页界面详细设计 233.1.2. 文件传输界面详细设计 243.1.3. 操作历史记录显示界面详细设计 263.1.4. 常用地址查询模块设计 263.2. 功能模块实现 273.2.1. 连接服务器 273.2.2. 显示服务器端文件清单 283.2.3. 上传文件 293.2.4. 下载文件 293.2.5. 查询历史记录 303.2.6. 常
3、用地址管理 314. 数据库建设 314.1. 数据库表结构 314.2. 数据库关系模型 324.3. 数据库 ER 图 334.4. 数据库建表语句 335. 结语 34参考文献 35基于 C#的 FTP 客户端设计与实现服务器 - F T P服务器 a服务器 b用户 - F T P用户 b 2用户 a 1用户接口用户文件传输系统文件传输系统F T P 请求F t p 响应数据连接图 1-1 FTP 工作模式图上图中用户 PI开始控制连接,控制连接与 Telnet协议很象。在开始阶段,标准 FTP命令由用户 PI产生并通图 1-2过控制连接传送到服务器进程。服务器 PI向用户 PI返回标准
4、应答。FTP 命令指定数据连接参数和文件系统操作。用户 DTP在特定数据端口侦听,服务器开始数据连接并以指定的参数开始数据传输。数据端口不必在开始 FTP命令的机器上,但用户或用户 FTP进程必须确定它在指定的数据端口上侦听.这个数据连接是全双工的。1. FTP 客户端总体设计1.1. 设计目的及开发环境1.1.1. 设计目的FTP早已应用在网络的各个方面,比如我们在访问网络上的资源时,经常会遇到需要连接 FTP服务器来下载,或者你制作了一个网站,想要将其上传至服务器,让大家能够访问它,这个时候就会用到 FTP客户端。虽然平时使用windows自带的 IE浏览器即可实现对 FTP服务器的访问,
5、但是 IE只是个很粗糙的 FTP客户端。IE 浏览器在 6.0以下的版本不支持 PASV方式访问服务器,而且 IE浏览器在登录 FTP服务器的时候,无法查看返回的信息,在出错的时候,2无法找到错误的原因,因此在使用上很不方便。现在大多数的 FTP客户端软件都是收费版的,而且以英文版居多,使用上操作很复杂,目前流行的有CoreFtp、AceFtp、FtpVoyager 等,但是大多数用户并不习惯使用这些软件。本文所设计的 FTP客户端则适合大多数用户使用,界面设计的很简单,使用户可以一目了然,而且具备 FTP客户端的基本功能,可以作为下载、上传文件的工具来使用。1.1.2. NET 环境简介Vi
6、sual StudioNET 是一个开发和运行软件的新环境,便于开发基于网络的服务,拥有丰富的运行库,支持多种编程语言编写的组件,具有跨语言平台的互操作能力。C#是NET 平台中最重要的语言,它本身没有类库,而是使用NET 框架所提供的统一类库,用户也可以定义特定域的属性,并将它们应用于任何语言元素如类、接口等,所以对网络应用程序提供完整的支援,这使得程序员能够在新的微软NET 平台上快速开发出种类丰富的应用程序。1.1.3. FtpWebRequest 类C#.NET类库的存在使它适合于一个不断发展的环境。在类库中我们可以自由地加入新的方法和实例变量而不会影响用户程序的执行。NET 平台封装
7、了实现 FTP功能的一些基础类,位于命名空间为SystemNet 下的 FtpWebRequest类用于实现文件传输协议(FTP)客户端的一些基本功能。二次封装了类 FFP_Class,其成员包括 string tipserveriP (服务器地址)、string ftpUseriD(登陆账号)、string ftpPassword (登录密码)和FtpWebRequest reqFTP。本文所使用的 FtpWebRequest类的构造方法和主要方法如下:FtpWebRequest reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(Pat
8、h);此构造函数利用给出的主机名建立一条 FTP连接,目的连接地址为 Path所指定的地址,并建立 URI对象。reqFtp.UseBinary = true;这条程序指定传输类型为 Binary。reqFtp.Credentials = new NetworkCredential(ftpUserId, ftpPassword);此方法利用参数 ftpUserId和 ftpPassword登录到 FTP服务器。使用过 Internet的3用户应该知道,匿名 FTP服务器的登录用户名为 anonymous,密码一般用自己的电子邮件地址。1.2. 系统 UML 分析1.2.1. FTP 客户端用例
9、图1) 0层用例图图 1-1 0 层用例图用户通过 Ftp 客户端系统进行文件传输。2) 1层用例图图 1-2 1 层用例图在 Ftp 客户端系统中,主要包括六个用例,分别是列出服务器端文件列表(ListServerFile ) 、从服务器端下载文件(DownLoadFile) 、向服务器端上传文件(UpLoadFile) 、列出历史记录(ListHistory) 、对常用地址的操作(OpeatUsefulAddress)和输入用户登录信息(EnterUserInfo) 。其中,每一个用例都包4含 EnterUserInfo 用例,列出服务器文件列表(ListServerFile)用例扩展了下
10、载文件(DownLoadFile )用例。3) 二层用例图a. ListServerFileList 子用例图。图 1-3 2 层用例图ListServerFileList 用例包含了两个子用例,分别为列出服务器端文件列表(ShowServerFileList) 、打开目录(ChangeDirectory ) 。打开目录用例指的是打开服务器端子目录,获取子目录。b. OperatUsefulAddress 子用例图。图 1-4 OperatUsefulAddress 子用例图OperatUsefulAddress 用例包含了两个子用例图,分别为显示常用的 ftp 服务器端地址(ShowUser
11、fulAddress) 、添加常用的服务器地址(AddUsefulAddress) 。1.2.2. FTP 客户端主要序列图1) ShowServerFileList序列图5图 1-5 ShowServerFileList 序列图2) ChangeDirectory序列图图 1-6 ChangeDirectory 序列图3) DownLoadFile序列图6图 1-7 DownLoadFile 序列图4) UpLoadFile序列图图 1-8 UpLoadFile 序列图5) ListHistory序列图7图 1-9 ListHistory 序列图6) AddUsefulAddress序列图图
12、 1-10 AddUsefulAddress 序列图1.2.3. FTP 客户端主要活动图1) DownLoadFile活动图8图 1-11 DownLoadFile 活动图2) UpLoadFile活动图图 1-12 UpLoadFile 活动图1.2.4. FTP 客户端类图1) 类关系图9图 1-13 FTP 客户端类图2) 边界类-IndexPage 、DownLoadPage、HisetoryPage、UsefulAddressPage图 1-14 边界类客户端中的主要边界类是显示各功能模块的页面,包括显示主页的 IndexPage,显示下载界面的 DownLoadPage,显示历史
13、记录的 HistoryPage,显示常用地址的UsefulAddressPage。用于与用户的交互,获取用户输入的信息,显示信息。3) 控制类-DataBaseHander10图 1-15 控制类-DataBaseHande控制类-DataBaseHande,封装了对于数据库的操作,是数据库操作类,包括的方法有:插入历史记录(InsertHistory)查找历史记录(selectHistory )插入常用地址(InsertUsefulAddr)查找常用地址(selectUsefulAddr)删除常用地址(DeleteUsefulAddr )系统通过调用该类对象的该类方法实现对数据库的操作。4)
14、 控制类-FtpHander图 1-16 控制类-FtpHander控制类-FtpHander,封装了对于 Ftp 文件传输的操作,包括的方法有:连接 Ftp 客户端(connect)获取服务器端文件目录(getServerFileList)上传文件(UpLoadFile)下载文件(DownLoadFile)通过该类实现对于文件的操作和服务器的连接和方法请求。5) 控制类-LocalHander11图 1-17 控制类-LocalHander控制类-LocalHander ,封装了对于本地路径的操作,包括的方法有:获取本地目录下的文件列表(GetLocalFileList)客户端通过该类实现对
15、本地文件的操作。6) 角色类-FtpAddr图 1-18 角色类-FtpAddr角色类-FtpAddr,表示 Ftp 服务器端的抽象类。属性:Ftp 服务器端名称(FtpName)string 型Ftp 服务器端地址(FtpAddress)string 型方法:获取服务器端名称(getFtpName)设置服务器端名称(setFtpName)获取服务器端 IP 地址(getFtpIPaddr)设置服务器端 IP 地址(setFtpIPaddr)7) 角色类-FileName图 1-19 7)角色类-FileName角色类-FileName,表示文件的抽象类。属性:文件名称(name)string
16、 型文件大小(size)string 型12方法:获取文件名称(getName )设置文件名称(setName)获取文件大小(getSize)设置文件大小(setSize)1.3. 系统功能模块1.3.1. 系统整体框架图F T P 客户端系统文件下载历史记录文件上传常用地址查询图 1-20 系统整体框架图1.3.2. 客户端功能模块FTP客户端作为用户连接 FTP服务器的工具,需要具备一些基本功能模块,如连接、上传、下载等,其中最主要的五大功能模块如下:1. 下载功能模块:连接用户指定的 FTP服务器,获取服务器目录下的文件列表,当用户选择项目为文件时,点击下载可以下载用户所需要的文件。选定
17、文件后提示用户将文件存储在何处,用户选择存储区后开始下载任务。依靠 FTP协议的支持,用户下载的文件没有类型和大小限制,即用户可已选择任何自己想要下载的文件,通过 FTP客户端进行下载。2. 上传功能模块:用户可以自行选择本机上存储的文件,上传至 FTP服务器。13在用户选择存储在服务器的位置后,点击上传,选择所需要上传的文件,即可将文件上传至服务器。3. 连接功能模块:将用户本机与指定的 IP地址连接,验证用户命和密码,在FTP服务器上进行注册。4. 显示服务器文件模块:显示 ftp服务器端的文件列表,包括切换服务器目录功能。显示服务器列表显示文件 打开目录图 1-21 显示服务器文件模块5
18、. 显示历史记录模块:列出以往的操作记录,方便用户查询所下载的文件信息。6. 常用地址操作模块:包括查询常用地址和增加常用地址两个功能。常用地址操作添加常用地址 查询常用地址图 1-22 常用地址操作模块有了这六个基本的功能模块,客户端的基本应用功能即可实现。141.3.3. 客户端界面设计为了使用户能够方便的使用 FTP客户端,在设计中我将数据输入和信息显示整合在一个页面中,全部客户端仅包含一个主要的窗口,窗口中有 4个 WPF页分别包括以下四个主要页界面:1、首页:用户打开软件所见到的的界面。图 1-23 首页2、文件传输界面:文件传输界面分为三层结构,第一层为用户下载地址输入层,第二层为
19、目标 FTP服务器端文件列表,第三层为本地下载路径中的文件列表。15图 1-24 文件传输界面3、历史记录查询界面:从数据库中读取用户的操作历史记录,让用户查询曾经下载的文件信息。16图 1-25 历史记录查询界面4、常用地址界面,列出常用的 ftp服务器地址,方便用户使用,并提供自行添加地址的功能。图 1-26 常用地址界面1.4. 数据流程图1.4.1. 客户端连接流程图运行客户端后,首先是连接服务器,需要输入服务器 IP地址点击连接按钮后开始连接服务器。下图为客户端连接流程图。17发送用户名与密码至服务器连接服务器是否连接成功显示连接失败显示连接成功获取服务器文件列表刷新服务器文件显示文
20、件列表开始用户输入用户名及密码开始是 否图 1-27 客户端连接流程图连接的结果有两种,即图中显示的连接失败和连接成功。181.4.2. 上传子模块流程图当用户点击上传按钮后,用户可以选择需要上传的文件,将本机上的文件上传至 FTP服务器。下图为上传子模块流程图。开始双击需上传文件获取上传的文件名连接服务器上传文件弹出对话框显示上传失败上传是否成功弹出对话框显示上传成功更新服务器文件列表结束否是图 1-28 上传模块流程图19上传的结果有两种,上传失败和成功,失败时会提示用户上传失败,原因可能是权限,如果成功上传,则提示上传成功。1.4.3. 下载子模块流程图当用户在服务器文件列表中选择想要下
21、载的文件后,选择需要下载文件在本机上的存储位置,将服务器上的文件下载至本机。下图为上传子模块流程图。开始获取文件列表双击需下载的文件连接服务器下载文件弹出对话框显示上传失败下载是否成功弹出对话框显示下载成功更新本地文件列表结束否是图 1-29 下载模块流程图202. FTP 客户端程序实现2.1. WPF 界面设计2.1.1. 首页界面详细设计首页左侧有四个按钮连接到不同功能的 WPF页,主要界面为欢迎界面,用户可以通过点击按钮选择需要的功能。通过 datagrid来布局整个页面。主要 Wpf设计代码:2.1.2. 文件传输界面详细设计文件传输界面分为三层结构,第一层为用户下载地址输入层,第二
22、层为目标 FTP服务器端文件列表,第三层为本地下载路径中的文件列表。通过 Grid将整个页面分为三行,每一行嵌入一个 stackpanel,并在第一行再次用 Grid布局将第一行分为三列,第一列放提示信息用的 label,第二列放输入用的inputtex,第三列放一个 button控件。页面结构 wpf代码:第一层用来记录用来输入服务器的站点,用户名和密码信息,然后将信息发送到服务器进行验证,利用 inputBox控件来实现。在程序运行时,用户在输22入框 url中输入的 FTP服务器站点。利用点击按钮触发 onClick事件获取输入框中的数据,将 url中的数据存储至 path变量 中,将
23、username中的数据存储至 username中;Wpf设计代码:第二层的作用是是显示服务器文件列表,利用 Datagrid控件来实现。在客户端主界面创建一个 Datagrid,命名为 gridServerFileList,并置于主界面中间,该表格包括三个数据项:文件名 file,文件大小 filesizes,修改日期filedates,使用一个 ListserverFileList来存储这三个数据。当客户端连接上服务器时,表格数据自动更新,主要功能使用getServerfFileList()函数实现。当服务器连接切换到当前目录,通过对WebRequestMethods.Ftp的 metho
24、d赋值为 ListDirectory并获取来自服务器端的应答流,读取应答流来实现。Wpf设计代码:/Border第三层的作用是是显示本地文件列表,和第二层一样利用 Datagrid控件来实现。在客户端主界面创建一个 Datagrid,命名为 localFileList,并置于主界面中间,该表格包括三个数据项:文件名 file,文件大小 filesizes,修改日期 filedates,使用一个 ListlocalFileList来存储这三个数据。当客户端连接上本地时,表格数据自动更新,主要功能使用getLocalFileList()函数实现。当服务器连接切换到当前目录,通过对调用23GetLo
25、calFileList()函数获取来自本地目录的应答流,读取应答流来实现。Wpf设计代码:2.1.3. 操作历史记录显示界面详细设计这个模块是历史信息显示模块,使用 datagrid控件实现。通过从数据库中读取数据,作为 datagrid的数据源。Wpf设计代码:2.1.4. 常用地址查询模块设计此模块主要存储常用的一些 ftp服务器地址方便用户下载资源,用户也可以通过添加按钮添加地址。此模块主要分为两层,上层为信息输入模块,通过一个提示 lable,两个输入框 inputTex和一个 button控件来获取用户输入的服务器端信息。Wpf布局代码:24上层设计代码:下层设计代码:2.2. 功能
26、模块实现2.2.1. 连接服务器客户端中 FtpHander类中 connect方法用来实现连接服务器功能,在C#.NET中实现这一功能是借助 FtpWebRequest类完成的,首先是使用FtpWebRequest类的(FtpWebRequest)FtpWebRequest.Create(new Uri(Path);方法打开远程 FTP服务器,然后使用 FtpWebRequest类的NetworkCredential(ftpUserId, ftpPassword);方法登录服务器。登录远程FTP服务器有两种方式,一种是注册用户登录,另一种是以匿名方式登录。使用第一种方式登录需要拥有该服务器的
27、注册用户名和密码,匿名方式则是以anonymous作为用户名来登录。类 FtpWebRequest提供了如下两个可用于打开与 FTP服务器之间的连接的方法1.FtpWebRequest.Create(new Uri(Path)用于创建与 ftp服务器端连接的对象。2.reqFtp.UseBinary = true;用于指定数据传输类型3.reqFtp.Credentials = new NetworkCredential(ftpUserId, ftpPassword);用于建立一条与指定主机、指定端口上的 FTP服务器的连接。本文所使用的是第一种方法进行连接,首先定义 4个字符串,命名为 us
28、ername,password,分别用来接收来自数据输入界面的数据。然后将接收到的数据发送至服务器验证,验证成功则使用对话框函数在信息显示界面中提示连接成功,失败则显示连接失败。核心代码如下:25reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(Path);/创建对象reqFtp.UseBinary = true;/指定传输类型reqFtp.Credentials = new NetworkCredential(ftpUserId, ftpPassword);/登录2.2.2. 显示服务器端文件清单客户端中实现显示服务器端的文件为 Ftp
29、Hander类中的GetServerFileList(DataGrid gridServerFileList,string path)函数来实现。当用户选择文件下载时,客户端会创建一个到 FTP服务器的连接,同样使用FtpWebRequest类的 FtpWebRequest.Create(new Uri(Path)方法和reqFtp.Credentials = new NetworkCredential(ftpUserId, ftpPassword);操作登录到服务器,把传输格式设置为二 进 制 格 式 , 向服务器发送 reqFtp.Method = WebRequestMethods.Ft
30、p.ListDirectory;操作获取文件列表,利用服务器 FtpWebRequest对象的 GetRequestStream ()方法获取服务器端传输过来的数据流,将流中数据写入数组缓存中,并利用 streamreader对象读出文件列表的内容放入 serverFileList中作为 datagrid的数据源显示在datagrid中。核心代码如下:reqFtp.Method = WebRequestMethods.Ftp.ListDirectory;WebResponse response = reqFtp.GetResponse();StreamReader reader = new S
31、treamReader(response.GetResponseStream();string line = reader.ReadLine();while (line != null)FileName fn = new FileName(line);serverFileList.Add(fn);line = reader.ReadLine();/获取文件大小for (int i = 0; i 0) rw.Write(buffer);readcount=ftpStream.Read (buffer,0,bufferSize);rw.Close();fs.Close();2.2.5. 查询历史记
32、录查询历史记录功能主要是通过数据库操作来实现的,我在程序中为数据库操作封装了一个 DataBaseHander类,包括查询插入删除方法,每次用户在上传或下载一次文件时,就调用 DataBaseHander类的 InsertHistory(string filename, string localDirectory, string addr)方法,将此次操作的文件名,存储地址和服务器地址存储进数据库中。每插入成功后就调用 SelectHistory( DataGrid gridHistory)函数刷新当前页面重新显示记录内容。核心代码如下:using (var context = new Ftp
33、dbEntities()history h = new history()opType = “下载“,tfilename = filename,localDirectory = localDirectory,addr = addr;28trycontext.history.AddObject(h);context.SaveChanges();catch (Exception ex)MessageBox.Show(“添加失败“);2.2.6. 常用地址管理常用地址管理与历史记录查询功能一样主要是通过数据库操作来实现的,我在程序中为数据库操作 DataBaseHander类添加了一个SelectU
34、sefulAddr(DataGrid gridAddr)方法,当打开此页时,就从数据库中读取数据,将常用的地址信息显示在 datagrid中,此外,用户还可以自己插入常用的地址。每插入成功后就刷新当前页面重新显示记录内容。核心代码如下:public void InsertUsefulAddr(string ftpName, string ftpAddr)using (var context = new FtpdbEntities()usefulAddr ad = new usefulAddr()name = ftpName,addr = ftpAddr,;trycontext.usefulAddr.AddObject(ad);context.SaveChanges();catch (Exception ex)MessageBox.Show(“添加失败“);3. 数据库建设3.1. 数据库表结构因为 FTP服务器的主要功能为文件的上传和下载,所以数据库表并不多,主要用于存储下载上传记录和常用的 IP地址数据表。表结构如下图所示: