基于C#的FTP客户端设计与实现【实用文档】doc_第1页
基于C#的FTP客户端设计与实现【实用文档】doc_第2页
基于C#的FTP客户端设计与实现【实用文档】doc_第3页
基于C#的FTP客户端设计与实现【实用文档】doc_第4页
基于C#的FTP客户端设计与实现【实用文档】doc_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于C#的FTP客户端设计与实现【实用文档】doc文档可直接使用可编辑,欢迎下载

基于C#的FTP客户端设计与实现【实用文档】doc文档可直接使用可编辑,欢迎下载《基于C#的FTP客户端实现》实验课程:C#期末大作业学生姓名:学号:专业班级:指导老师:完成日期:2014年12月20日目录TOC\o”1-3”\h\u29389摘要PAGEREF_Toc293891引言PAGEREF_Toc76681HYPERLINK\l_Toc282521.FTP协议分析PAGEREF_Toc2825211。1。FTP的工作原理PAGEREF_Toc1657411。2.FTP工作模式PAGEREF_Toc492021。3。FTP传输模式PAGEREF_Toc1679142.FTP客户端总体设计PAGEREF_Toc52452。1。设计目的及开发环境PAGEREF_Toc168752.1。1.设计目的与.NET环境简介PAGEREF_Toc559052.1.3.FtpWebRequest类PAGEREF_Toc104866HYPERLINK\l_Toc118962。2.系统UML分析PAGEREF_Toc1189662。2。1.FTP客户端用例图PAGEREF_Toc144866HYPERLINK\l_Toc124162.2。2.FTP客户端主要序列图与活动图PAGEREF_Toc1241682.2.4。FTP客户端类图PAGEREF_Toc8833122。3.系统功能模块PAGEREF_Toc1810915HYPERLINK\l_Toc149762.3.1.系统整体框架图PAGEREF_Toc1497615HYPERLINK\l_Toc323272。3.2.客户端功能模块PAGEREF_Toc3232715HYPERLINK\l_Toc216172.3.3。客户端界面设计PAGEREF_Toc21617162。4.数据流程图PAGEREF_Toc1264319HYPERLINK\l_Toc287822.4.1.客户端连接流程图PAGEREF_Toc2878219HYPERLINK\l_Toc53992.4.2。上传子模块流程图99212.4.3。下载子模块流程图PAGEREF_Toc599822HYPERLINK\l_Toc159703。FTP客户端程序实现PAGEREF_Toc1597023HYPERLINK\l_Toc7193.1。WPF界面设计PAGEREF_Toc719233.1。1.首页界面详细设计PAGEREF_Toc2423HYPERLINK\l_Toc13423。1。2.文件传输界面详细设计PAGEREF_Toc1342243.1.3.操作历史记录显示界面详细设计PAGEREF_Toc1042526HYPERLINK\l_Toc265513.1.4.常用地址查询模块设计PAGEREF_Toc2655126HYPERLINK\l_Toc102053。2.功能模块实现PAGEREF_Toc10205273.2.1.连接服务器PAGEREF_Toc1733727HYPERLINK\l_Toc82383.2。2.显示服务器端文件清单238283。2。3.上传文件761629HYPERLINK\l_Toc210023。2。4。下载文件PAGEREF_Toc2100229HYPERLINK\l_Toc159983.2.5。查询历史记录PAGEREF_Toc1599830HYPERLINK\l_Toc277043.2.6.常用地址管理PAGEREF_Toc27704314.数据库建设PAGEREF_Toc2303331HYPERLINK\l_Toc315824.1.数据库表结构PAGEREF_Toc3158231HYPERLINK\l_Toc104704.2.数据库关系模型PAGEREF_Toc1047032HYPERLINK\l_Toc138514.3.数据库ER图PAGEREF_Toc13851334。4。数据库建表语句PAGEREF_Toc1132833HYPERLINK\l_Toc48485.结语PAGEREF_Toc484834HYPERLINK\l_Toc23606参考文献PAGEREF_Toc2360635基于C#的FTP客户端设计与实现图STYLEREF1\s1-SEQ图\*ARABIC\s11FTP工作模式图上图中用户PI开始控制连接,控制连接与Telnet协议很象。在开始阶段,标准FTP命令由用户PI产生并通图STYLEREF1\s1—SEQ图\*ARABIC\s12过控制连接传送到服务器进程。服务器PI向用户PI返回标准应答。FTP命令指定数据连接参数和文件系统操作。用户DTP在特定数据端口侦听,服务器开始数据连接并以指定的参数开始数据传输。数据端口不必在开始FTP命令的机器上,但用户或用户FTP进程必须确定它在指定的数据端口上侦听.这个数据连接是全双工的.FTP客户端总体设计设计目的及开发环境设计目的FTP早已应用在网络的各个方面,比如我们在访问网络上的资源时,经常会遇到需要连接FTP服务器来下载,或者你制作了一个网站,想要将其上传至服务器,让大家能够访问它,这个时候就会用到FTP客户端。虽然平时使用windows自带的IE浏览器即可实现对FTP服务器的访问,但是IE只是个很粗糙的FTP客户端。IE浏览器在6.0以下的版本不支持PASV方式访问服务器,而且IE浏览器在登录FTP服务器的时候,无法查看返回的信息,在出错的时候,无法找到错误的原因,因此在使用上很不方便。现在大多数的FTP客户端软件都是收费版的,而且以英文版居多,使用上操作很复杂,目前流行的有CoreFtp、AceFtp、FtpVoyager等,但是大多数用户并不习惯使用这些软件.本文所设计的FTP客户端则适合大多数用户使用,界面设计的很简单,使用户可以一目了然,而且具备FTP客户端的基本功能,可以作为下载、上传文件的工具来使用。NET环境简介VisualStudio.NET是一个开发和运行软件的新环境,便于开发基于网络的服务,拥有丰富的运行库,支持多种编程语言编写的组件,具有跨语言平台的互操作能力.C#是.NET平台中最重要的语言,它本身没有类库,而是使用.NET框架所提供的统一类库,用户也可以定义特定域的属性,并将它们应用于任何语言元素如类、接口等,所以对网络应用程序提供完整的支援,这使得程序员能够在新的微软。NET平台上快速开发出种类丰富的应用程序.FtpWebRequest类C#.NET类库的存在使它适合于一个不断发展的环境。在类库中我们可以自由地加入新的方法和实例变量而不会影响用户程序的执行。.NET平台封装了实现FTP功能的一些基础类,位于命名空间为System。Net下的FtpWebRequest类用于实现文件传输协议(FTP)客户端的一些基本功能。二次封装了类FFP_Class,其成员包括stringtipserveriP(服务器地址)、stringftpUseriD(登陆账号)、stringftpPassword(登录密码)和FtpWebRequestreqFTP。本文所使用的FtpWebRequest类的构造方法和主要方法如下:FtpWebRequestreqFtp=(FtpWebRequest)FtpWebRequest.Create(newUri(Path));此构造函数利用给出的主机名建立一条FTP连接,目的连接地址为Path所指定的地址,并建立URI对象。reqFtp。UseBinary=true;这条程序指定传输类型为Binary.ﻩreqFtp.Credentials=newNetworkCredential(ftpUserId,ftpPassword);此方法利用参数ftpUserId和ftpPassword登录到FTP服务器.使用过Internet的用户应该知道,匿名FTP服务器的登录用户名为anonymous,密码一般用自己的电子邮件地址。系统UML分析FTP客户端用例图0层用例图图STYLEREF1\s2-SEQ图\*ARABIC\s110层用例图用户通过Ftp客户端系统进行文件传输。1层用例图图STYLEREF1\s2-SEQ图\*ARABIC\s121层用例图在Ftp客户端系统中,主要包括六个用例,分别是列出服务器端文件列表(ListServerFile)、从服务器端下载文件(DownLoadFile)、向服务器端上传文件(UpLoadFile)、列出历史记录(ListHistory)、对常用地址的操作(OpeatUsefulAddress)和输入用户登录信息(EnterUserInfo)。其中,每一个用例都包含EnterUserInfo用例,列出服务器文件列表(ListServerFile)用例扩展了下载文件(DownLoadFile)用例。二层用例图ListServerFileList子用例图.图STYLEREF1\s2—SEQ图\*ARABIC\s132层用例图ListServerFileList用例包含了两个子用例,分别为列出服务器端文件列表(ShowServerFileList)、打开目录(ChangeDirectory)。打开目录用例指的是打开服务器端子目录,获取子目录.OperatUsefulAddress子用例图。图STYLEREF1\s2—SEQ图\*ARABIC\s14OperatUsefulAddress子用例图OperatUsefulAddress用例包含了两个子用例图,分别为显示常用的ftp服务器端地址(ShowUserfulAddress)、添加常用的服务器地址(AddUsefulAddress).FTP客户端主要序列图ShowServerFileList序列图图STYLEREF1\s2—SEQ图\*ARABIC\s15ShowServerFileList序列图ChangeDirectory序列图图STYLEREF1\s2-SEQ图\*ARABIC\s16ChangeDirectory序列图DownLoadFile序列图图STYLEREF1\s2-SEQ图\*ARABIC\s17DownLoadFile序列图UpLoadFile序列图图STYLEREF1\s2-SEQ图\*ARABIC\s18UpLoadFile序列图ListHistory序列图图STYLEREF1\s2-SEQ图\*ARABIC\s19ListHistory序列图AddUsefulAddress序列图图STYLEREF1\s2—SEQ图\*ARABIC\s110AddUsefulAddress序列图FTP客户端主要活动图DownLoadFile活动图图STYLEREF1\s2—SEQ图\*ARABIC\s111DownLoadFile活动图UpLoadFile活动图图STYLEREF1\s2—SEQ图\*ARABIC\s112UpLoadFile活动图FTP客户端类图类关系图图STYLEREF1\s2-SEQ图\*ARABIC\s113FTP客户端类图边界类—IndexPage、DownLoadPage、HisetoryPage、UsefulAddressPage图STYLEREF1\s2—SEQ图\*ARABIC\s114边界类客户端中的主要边界类是显示各功能模块的页面,包括显示主页的IndexPage,显示下载界面的DownLoadPage,显示历史记录的HistoryPage,显示常用地址的UsefulAddressPage.用于与用户的交互,获取用户输入的信息,显示信息。控制类—DataBaseHander图STYLEREF1\s2-SEQ图\*ARABIC\s115控制类-DataBaseHande控制类-DataBaseHande,封装了对于数据库的操作,是数据库操作类,包括的方法有:插入历史记录(InsertHistory)查找历史记录(selectHistory)插入常用地址(InsertUsefulAddr)查找常用地址(selectUsefulAddr)删除常用地址(DeleteUsefulAddr)系统通过调用该类对象的该类方法实现对数据库的操作。控制类—FtpHander图STYLEREF1\s2-SEQ图\*ARABIC\s116控制类-FtpHander控制类-FtpHander,封装了对于Ftp文件传输的操作,包括的方法有:连接Ftp客户端(connect)获取服务器端文件目录(getServerFileList)上传文件(UpLoadFile)下载文件(DownLoadFile)通过该类实现对于文件的操作和服务器的连接和方法请求.控制类-LocalHander图STYLEREF1\s2-SEQ图\*ARABIC\s117控制类-LocalHander控制类-LocalHander,封装了对于本地路径的操作,包括的方法有:获取本地目录下的文件列表(GetLocalFileList)客户端通过该类实现对本地文件的操作。角色类-FtpAddr图STYLEREF1\s2—SEQ图\*ARABIC\s118角色类-FtpAddr角色类-FtpAddr,表示Ftp服务器端的抽象类。属性:Ftp服务器端名称(FtpName)string型Ftp服务器端地址(FtpAddress)string型方法:获取服务器端名称(getFtpName)设置服务器端名称(setFtpName)获取服务器端IP地址(getFtpIPaddr)设置服务器端IP地址(setFtpIPaddr)角色类-FileName图STYLEREF1\s2-SEQ图\*ARABIC\s1197)角色类-FileName角色类-FileName,表示文件的抽象类。属性:文件名称(name)string型文件大小(size)string型方法:获取文件名称(getName)设置文件名称(setName)获取文件大小(getSize)设置文件大小(setSize)系统功能模块系统整体框架图图STYLEREF1\s2-SEQ图\*ARABIC\s120系统整体框架图客户端功能模块FTP客户端作为用户连接FTP服务器的工具,需要具备一些基本功能模块,如连接、上传、下载等,其中最主要的五大功能模块如下:下载功能模块:连接用户指定的FTP服务器,获取服务器目录下的文件列表,当用户选择项目为文件时,点击下载可以下载用户所需要的文件。选定文件后提示用户将文件存储在何处,用户选择存储区后开始下载任务。依靠FTP协议的支持,用户下载的文件没有类型和大小限制,即用户可已选择任何自己想要下载的文件,通过FTP客户端进行下载。上传功能模块:用户可以自行选择本机上存储的文件,上传至FTP服务器。在用户选择存储在服务器的位置后,点击上传,选择所需要上传的文件,即可将文件上传至服务器。连接功能模块:将用户本机与指定的IP地址连接,验证用户命和密码,在FTP服务器上进行注册.显示服务器文件模块:显示ftp服务器端的文件列表,包括切换服务器目录功能。图STYLEREF1\s2—SEQ图\*ARABIC\s121显示服务器文件模块显示历史记录模块:列出以往的操作记录,方便用户查询所下载的文件信息。常用地址操作模块:包括查询常用地址和增加常用地址两个功能。图STYLEREF1\s2-SEQ图\*ARABIC\s122常用地址操作模块有了这六个基本的功能模块,客户端的基本应用功能即可实现。客户端界面设计为了使用户能够方便的使用FTP客户端,在设计中我将数据输入和信息显示整合在一个页面中,全部客户端仅包含一个主要的窗口,窗口中有4个WPF页分别包括以下四个主要页界面:首页:用户打开软件所见到的的界面。图STYLEREF1\s2—SEQ图\*ARABIC\s123首页文件传输界面:文件传输界面分为三层结构,第一层为用户下载地址输入层,第二层为目标FTP服务器端文件列表,第三层为本地下载路径中的文件列表。图STYLEREF1\s2—SEQ图\*ARABIC\s124文件传输界面历史记录查询界面:从数据库中读取用户的操作历史记录,让用户查询曾经下载的文件信息.图STYLEREF1\s2-SEQ图\*ARABIC\s125历史记录查询界面常用地址界面,列出常用的ftp服务器地址,方便用户使用,并提供自行添加地址的功能。图STYLEREF1\s2—SEQ图\*ARABIC\s126常用地址界面数据流程图客户端连接流程图运行客户端后,首先是连接服务器,需要输入服务器IP地址点击连接按钮后开始连接服务器.下图为客户端连接流程图.图STYLEREF1\s2-SEQ图\*ARABIC\s127客户端连接流程图连接的结果有两种,即图中显示的连接失败和连接成功。上传子模块流程图当用户点击上传按钮后,用户可以选择需要上传的文件,将本机上的文件上传至FTP服务器。下图为上传子模块流程图.图STYLEREF1\s2—SEQ图\*ARABIC\s128上传模块流程图上传的结果有两种,上传失败和成功,失败时会提示用户上传失败,原因可能是权限,如果成功上传,则提示上传成功。下载子模块流程图当用户在服务器文件列表中选择想要下载的文件后,选择需要下载文件在本机上的存储位置,将服务器上的文件下载至本机。下图为上传子模块流程图.图STYLEREF1\s2-SEQ图\*ARABIC\s129下载模块流程图FTP客户端程序实现WPF界面设计首页界面详细设计首页左侧有四个按钮连接到不同功能的WPF页,主要界面为欢迎界面,用户可以通过点击按钮选择需要的功能。通过datagrid来布局整个页面。主要Wpf设计代码:<Grid〉<Grid.RowDefinitions><RowDefinitionHeight="70"/〉<RowDefinition/></Grid。RowDefinitions〉<!—-上半部分导航页面——><StackPanelGrid.Row="0"Background="LightBlue"〉〈LabelHeight=”70"Content=”CHEN'SFTP客户端"FontWeight="Bold"FontSize=”35"HorizontalContentAlignment="Center"Panel.ZIndex="0”/></StackPanel〉<!—-下半部分主题界面—-〉<GridGrid。Row="1"Grid。Column="0"〉<Grid.ColumnDefinitions〉〈ColumnDefinitionWidth="190"/>〈ColumnDefinition/></Grid.ColumnDefinitions><StackPanelBackground=”LightGray”Grid.Row="0"Grid.Column="0"〉<!--四个按钮——><ButtonName=”btnIndex"Height="50”Width="190”Background="LightCoral”Content=”首页"MouseEnter=”Button_MouseEnter"Click=”Button_Click"MouseLeave="Button_MouseLeave”MouseDown=”Button_MouseDown"MouseUp=”Button_MouseUp"/><ButtonName=”btnDownload"Height="50"Width="190"Background=”LightCoral”Content="文件传输”BorderBrush="LightCoral"MouseEnter="Button_MouseEnter"Click="Button_Click”MouseLeave=”Button_MouseLeave"MouseDown=”Button_MouseDown"MouseUp=”Button_MouseUp"/〉<ButtonName="btnHistory"Height="50"Width="190"Background=”LightCoral"Content="历史记录"MouseEnter=”Button_MouseEnter”Click="Button_Click"MouseLeave="Button_MouseLeave”MouseDown=”Button_MouseDown"MouseUp="Button_MouseUp"/><ButtonName="btnAddress"Height=”50”Width="190"Background=”LightCoral”Content="常用地址查询"MouseEnter="Button_MouseEnter"Click="Button_Click"MouseLeave=”Button_MouseLeave"MouseDown="Button_MouseDown"MouseUp="Button_MouseUp"/>〈/StackPanel>〈StackPanelName="Frame"Grid。Row="0"Grid.Column="1"><Framex:Name="framePage"NavigationUIVisibility="Hidden”Source=”PageWelcome.xaml”Background=”AliceBlue"Width="588"Height="492"></Frame></StackPanel>〈/Grid〉</Grid>文件传输界面详细设计文件传输界面分为三层结构,第一层为用户下载地址输入层,第二层为目标FTP服务器端文件列表,第三层为本地下载路径中的文件列表。通过Grid将整个页面分为三行,每一行嵌入一个stackpanel,并在第一行再次用Grid布局将第一行分为三列,第一列放提示信息用的label,第二列放输入用的inputtex,第三列放一个button控件。页面结构wpf代码:〈Grid><Grid。RowDefinitions〉〈RowDefinitionHeight="300”/><RowDefinition/〉</Grid.RowDefinitions>〈!—-服务器界面—->〈StackPanelGrid。Row="0"Background=”AliceBlue">〈Grid〉<Grid.RowDefinitions>〈RowDefinitionHeight=”30"/><RowDefinition/〉</Grid。RowDefinitions〉〈Grid.ColumnDefinitions><ColumnDefinitionWidth="100”/〉<ColumnDefinitionWidth=”300"/><ColumnDefinition/〉</Grid.ColumnDefinitions〉</Grid></StackPanel〉〈/Grid>第一层用来记录用来输入服务器的站点,用户名和密码信息,然后将信息发送到服务器进行验证,利用inputBox控件来实现.在程序运行时,用户在输入框url中输入的FTP服务器站点。利用点击按钮触发onClick事件获取输入框中的数据,将url中的数据存储至path变量中,将username中的数据存储至username中;Wpf设计代码:〈LabelGrid.Row=”0"Grid.Column="0"Content="下载地址:”HorizontalAlignment="Right”/〉<TextBoxName="txtServerPath"Grid.Row="0”Grid。Column="1"/>〈ButtonName=”btnServerSearch"Grid.Row="0"Grid.Column="2"Width="108"Content=”查询"Click="btnServerSearch_Click"/〉第二层的作用是是显示服务器文件列表,利用Datagrid控件来实现.在客户端主界面创建一个Datagrid,命名为gridServerFileList,并置于主界面中间,该表格包括三个数据项:文件名file,文件大小filesizes,修改日期filedates,使用一个List〈FileName〉serverFileList来存储这三个数据。当客户端连接上服务器时,表格数据自动更新,主要功能使用getServerfFileList()函数实现。当服务器连接切换到当前目录,通过对WebRequestMethods.Ftp的method赋值为ListDirectory并获取来自服务器端的应答流,读取应答流来实现。Wpf设计代码:〈Border><DataGridGrid.Column="1"Name="gridServerFileList"Width=”510"Height="300"ﻩ Background="LightCyan"AutoGenerateColumns="True" HorizontalScrollBarVisibility=”Visible"VerticalScrollBarVisibility="Visible"GridLinesVisibility="None”IsReadOnly="True"M ouseEnter="gridFileList_MouseEnter"SﻩelectionChanged="gridFileList_SelectionChanged"MouseUp="gridFileList_MouseUp" MouseDoubleClick="gridFileList_MouseDoubleClick"〉〈/DataGrid>/Border>第三层的作用是是显示本地文件列表,和第二层一样利用Datagrid控件来实现。在客户端主界面创建一个Datagrid,命名为localFileList,并置于主界面中间,该表格包括三个数据项:文件名file,文件大小filesizes,修改日期filedates,使用一个List〈FileName〉localFileList来存储这三个数据。当客户端连接上本地时,表格数据自动更新,主要功能使用getLocalFileList()函数实现。当服务器连接切换到当前目录,通过对调用GetLocalFileList()函数获取来自本地目录的应答流,读取应答流来实现。Wpf设计代码:〈StackPanelGrid。Row="1"Background="AliceBlue"><Border〉<DataGridName=”gridLocalFileList”Width=”510"Height="130”Background="LightCyan" ﻩAutoGenerateColumns=”True"HorizontalScrollBarVisibility="Visible"ﻩ VerticalScrollBarVisibility="Visible” ﻩﻩﻩﻩﻩﻩGridLinesVisibility="None”IsReadOnly="True"ﻩﻩ ﻩ MouseEnter="gridFileList_MouseEnter” ﻩ SelectionChanged=”gridFileList_SelectionChanged”ﻩ MouseDoubleClick="gridFileList_MouseDoubleClick">〈/DataGrid></Border></StackPanel〉操作历史记录显示界面详细设计这个模块是历史信息显示模块,使用datagrid控件实现.通过从数据库中读取数据,作为datagrid的数据源。Wpf设计代码:〈Grid><DataGridName="gridHistory"AutoGenerateColumns="True"ﻩHorizontalScrollBarVisibility=”Visible”Height="430"HorizontalAlignment=”Center" VerticalAlignment=”Center"Width=”510"/>〈/Grid〉常用地址查询模块设计此模块主要存储常用的一些ftp服务器地址方便用户下载资源,用户也可以通过添加按钮添加地址。此模块主要分为两层,上层为信息输入模块,通过一个提示lable,两个输入框inputTex和一个button控件来获取用户输入的服务器端信息.Wpf布局代码:<Grid〉〈Grid.RowDefinitions><RowDefinitionHeight="70"/〉<RowDefinition/></Grid.RowDefinitions><StackPanelGrid。Row="0”Grid.Column=”0”><Grid>〈Grid。ColumnDefinitions>〈ColumnDefinitionWidth="108*"/>〈ColumnDefinitionWidth=”156*"/〉〈ColumnDefinitionWidth=”160*"/><ColumnDefinitionWidth=”86*”/>〈/Grid.ColumnDefinitions>〈/grid>上层设计代码:<LabelContent="添加常用地址:”HorizontalAlignment="Right”Width="88"/>〈TextBoxName="tbFtpName"Grid。Column="1"Height="20”Text="请输入ftp服务端名称:"ﻩMargin=”6,3,0,3"GotFocus=”TextBox_GotFocus”LostFocus=”TextBox_LostFocus"/><TextBoxName="tbIpAddr”Grid。Column="2”Height=”20"Text="请输入IP地址:”ﻩMargin="6,3,0,3”GotFocus="TextBox_GotFocus”LostFocus="TextBox_LostFocus”/><ButtonName=”btnAdd"Grid.Column="3"Width="50"Height=”20"Content="添加"ﻩClick=”btnAdd_Click"/〉下层设计代码:<StackPanelGrid.Row="1”Grid.Column=”0”〉<DataGridName=”gridAddr"AutoGenerateColumns=”True"ﻩHorizontalScrollBarVisibility="Visible”Height="360"Width="510” HorizontalAlignment="Center"VerticalAlignment="Bottom"SelectionChanged="gridAddr_SelectionChanged” MouseRightButtonUp="gridAddr_MouseRightButtonUp"/></StackPanel〉功能模块实现连接服务器客户端中FtpHander类中connect方法用来实现连接服务器功能,在C#.NET中实现这一功能是借助FtpWebRequest类完成的,首先是使用FtpWebRequest类的(FtpWebRequest)FtpWebRequest。Create(newUri(Path));方法打开远程FTP服务器,然后使用FtpWebRequest类的NetworkCredential(ftpUserId,ftpPassword);方法登录服务器。登录远程FTP服务器有两种方式,一种是注册用户登录,另一种是以匿名方式登录。使用第一种方式登录需要拥有该服务器的注册用户名和密码,匿名方式则是以anonymous作为用户名来登录。类FtpWebRequest提供了如下两个可用于打开与FTP服务器之间的连接的方法FtpWebRequest.Create(newUri(Path))用于创建与ftp服务器端连接的对象。reqFtp。UseBinary=true;用于指定数据传输类型reqFtp。Credentials=newNetworkCredential(ftpUserId,ftpPassword);用于建立一条与指定主机、指定端口上的FTP服务器的连接。本文所使用的是第一种方法进行连接,首先定义4个字符串,命名为username,password,分别用来接收来自数据输入界面的数据。然后将接收到的数据发送至服务器验证,验证成功则使用对话框函数在信息显示界面中提示连接成功,失败则显示连接失败。核心代码如下:reqFtp=(FtpWebRequest)FtpWebRequest.Create(newUri(Path));//创建对象reqFtp.UseBinary=true;//指定传输类型reqFtp。Credentials=newNetworkCredential(ftpUserId,ftpPassword);//登录显示服务器端文件清单客户端中实现显示服务器端的文件为FtpHander类中的GetServerFileList(DataGridgridServerFileList,stringpath)函数来实现.当用户选择文件下载时,客户端会创建一个到FTP服务器的连接,同样使用FtpWebRequest类的FtpWebRequest.Create(newUri(Path))方法和reqFtp.Credentials=newNetworkCredential(ftpUserId,ftpPassword);操作登录到服务器,把传输格式设置为二进制格式,向服务器发送reqFtp。Method=WebRequestMethods。Ftp.ListDirectory;操作获取文件列表,利用服务器FtpWebRequest对象的GetRequestStream()方法获取服务器端传输过来的数据流,将流中数据写入数组缓存中,并利用streamreader对象读出文件列表的内容放入serverFileList中作为datagrid的数据源显示在datagrid中.核心代码如下:reqFtp。Method=WebRequestMethods.Ftp.ListDirectory;WebResponseresponse=reqFtp.GetResponse();StreamReaderreader=newStreamReader(response.GetResponseStream());stringline=reader。ReadLine();while(line!=null){FileNamefn=newFileName(line);serverFileList.Add(fn);line=reader.ReadLine();}//获取文件大小for(inti=0;i〈serverFileList.Count;i++){try{Connect(path+"/”+serverFileList[i]。name);reqFtp。Method=WebRequestMethods.Ftp。GetFileSize;response=reqFtp。GetResponse();longfileSize=response。ContentLength;serverFileList[i].size=fileSize。ToString();}catch(Exception){serverFileList[i].size="文件夹";continue;}}gridServerFileList.ItemsSource=serverFileList;上传文件客户端中实现上传功能的文件为FtpHander类中的uploadFile函数来实现.当用户选择文件上传时,客户端会创建一个到FTP服务器的连接,同样使用FtpWebRequest类的FtpWebRequest.Create(newUri(Path))方法和reqFtp。Credentials=newNetworkCredential(ftpUserId,ftpPassword);操作登录到服务器,把传输格式设置为二进制格式,利用要上传的本地文件构造Filelnfo对象,连接服务器,设置Method属性,通知服务器FtpWebRequest对象的GetRequestStream()方法创建文件写入流,将缓冲中的内容写入流中,并上传到服务器。文件大小,然后利用缓冲和文件流读取文件内容,通过FtpWebRequest将本地文件上传至FTP服务器.上传结束后关闭数据流,一般情况下FTP服务器为了保证其安全性,权限中会设置是否允许用户上传文件.上传失败时,出错处理会在对话框面板中显示出文件上传失败。上传的具体代码见附录。核心代码如下: Connect(url);reqFtp.KeepAlive=false;reqFtp.Method=WebRequestMethods。Ftp。UploadFile;//文件上传请求reqFtp.ContentLength=fileinfo。Length;intbuffLength=2048;byte[]buff=newbyte[buffLength];intcontentLen;FileStreamfs=fileinfo。OpenRead();//打开文件流读上传的文件Streamstream=reqFtp.GetRequestStream();//把上传的文件写入流contentLen=fs.Read(buff,0,buffLength);while(contentLen!=0){stream。Write(buff,0,buffLength);contentLen=fs。Read(buff,0,buffLength);}stream.Close();fs.Close();下载文件客户端下载文件由为FtpHander类中的downloadFile函数来实现。如果用户想要下载列表中的某一个文件,首先判断项目的类型是否是文件,如果是文件,则得到下载的文件名并下载文件,如果选中的是目录,则不能下载.用户选择好要下载的文件后,客户端打开服务器连接端口,使用FtpWebRequest类的FtpWebRequest。Create(newUri(Path))方法和reqFtp.Credentials=newNetworkCredential(ftpUserId,ftpPassword);操作登录到服务器,把传输格式设置为二进制格式,使用ftpClient。get()函数获得文件名,下载并保存至用户指定的路径.下载完成后ftpClient。closeServer()关闭与服务器的连接并清除线程。当用户下载失败时,出错处理会在信息显示面板中显示下载出错。下载的具体代码见附录。Connect(path+serverDirectory+”//”+serverfileName);reqFtp.Method=WebRequestMethods.Ftp.DownloadFile;//文件下载请求FtpWebResponseresponse;Try{response=(FtpWebResponse)reqFtp.GetResponse();//获得服务器端响应}catch(Exception){MessageBox.Show(serverfileName+"是目录!不可以下载!");return;}StreamftpStream=response.GetResponseStream();cl=response。ContentLength;///获取文件大小intbufferSize=2048;//设置缓冲byte[]buffer=newbyte[bufferSize];readcount=ftpStream。Read(buffer,0,bufferSize);FileStreamfs=newFileStream(downLoadFile,FileMode.OpenOrCreate,FileAccess。Write);BinaryWriterrw=newBinaryWriter(fs,Encoding。Default);//将文件通过二进制流下载while(readcount〉0){rw.Write(buffer);readcount=ftpStream.Read(buffer,0,bufferSize);}rw.Close();fs。Close();查询历史记录查询历史记录功能主要是通过数据库操作来实现的,我在程序中为数据库操作封装了一个DataBaseHander类,包括查询插入删除方法,每次用户在上传或下载一次文件时,就调用DataBaseHander类的InsertHistory(stringfilename,stringlocalDirectory,stringaddr)方法,将此次操作的文件名,存储地址和服务器地址存储进数据库中.每插入成功后就调用SelectHistory(DataGridgridHistory)函数刷新当前页面重新显示记录内容。核心代码如下:using(varcontext=newFtpdbEntities()){historyh=newhistory(){opType=”下载",tfilename=filename,localDirectory=localDirectory,addr=addr};try{context.history。AddObject(h);context。SaveChanges();}catch(Exceptionex){MessageBox.Show("添加失败");}}常用地址管理常用地址管理与历史记录查询功能一样主要是通过数据库操作来实现的,我在程序中为数据库操作DataBaseHander类添加了一个SelectUsefulAddr(DataGridgridAddr)方法,当打开此页时,就从数据库中读取数据,将常用的地址信息显示在datagrid中,此外,用户还可以自己插入常用的地址。每插入成功后就刷新当前页面重新显示记录内容。核心代码如下:publicvoidInsertUsefulAddr(stringftpName,stringftpAddr){using(varcontext=newFtpdbEntities()){usefulAddrad=newusefulAddr(){name=ftpName,addr=ftpAddr,};try{context.usefulAddr.AddObject(ad);context.SaveChanges();}catch(Exceptionex){MessageBox。Show(”添加失败");}}}数据库建设数据库表结构因为FTP服务器的主要功能为文件的上传和下载,所以数据库表并不多,主要用于存储下载上传记录和常用的IP地址数据表。表结构如下图所示:历史记录表:ID:自增性数据,唯一表示每条记录,主键Type:int型,标识此次操作为上传还是下载,上传为1,下载为0Filename:varchar(32),文件名字段,用于存储文件名Time:smalldatatime类型,默认值为数据插入时间,记录操作的操作时间Path:varchar(64)型,用以记录文件的下载存放位置Addr:varchar(16)型,用以记录文件的下载ftp服务端IP地址常用IP地址数据表:ID:自增性数据,唯一表示每条记录,主键Name:varchar(32),服务端名字段,用以记录服务端的名字Addr:varchar(16),记录服务端的IP地址。数据库关系模型History(Id,type,filename,time,path,addr);UsefulRecords(Id,name,addr);数据库ER图图STYLEREF1\s4-SEQ图\*ARABIC\s11数据库ER图数据库建表语句CREATETABLEhistory( Idintidentity(1,1)primarykey, typeint, filenamevarchar(32),ﻩtimesmalldatetimedefaultgetdate(),ﻩlocalDirectoryvarchar(64), addrvarchar(32));GOCREATETABLEusefulrecords( Idintidentity(1,1)primarykey,ﻩnamevarchar(32),ﻩaddrvarchar(16));GO结语FTP的目标是提高文件的共享性和可靠高效地传送数据,而FTP客户端的作用是使用户方便的连接和访问FTP服务器。本次试验实现了一个简单易用的FTP客户端,在分析FTP协议的基本工作原理和FTP的数据传输原理的基础上,详细介绍了如何使用C#.NET工具对FTP客户端进行设计,选择C#。NET类库来实现FTP客户端程序的上传下载等主要功能,并用MicrosoftVisioStdio2008软件提供的一个支持可视化编程的开发环境,从而实现了对FTP客户端的开发。虽然现在有很多实现FTP客户端程序的技术和方法,诸如Winsock控件和Delphi的Indy组件等,但是使用C#。NET在程序实现上显得更加简捷灵活,在本次试验中使用的方法也是比较便捷和高效的。参考文献[1]马俊.C#程序设计及应用教程.人民邮电出版社,2014年1月第3版[2]谢希仁.计算机网络(第五版).电子工业出版社,2013年6月第1版[3]龚俐,毛晓蛟。基于C#的FTP客户端实现。南京师范大学强化培养学院,2010年10月DSP课程设计姓名:学号:日期:一、实验目的加深对DFT算法原理和基本性质的理解;熟悉FFT的算法原理和FFT子程序的算法流程和应用;学习用FFT对连续信号和时域信号进行频谱分析的方法;学习DSP中FFT的设计和编程思想;学习使用CCS的波形观察器观察波形和频谱情况;二、实验内容用DSP汇编语言及C语言进行编程,实现FFT运算、对输入信号进行频谱分析。三、实验原理快速傅里叶变换FFT旋转因子WN有如下的特性。对称性:WNk+N/2=-WNk(2)周期性:WNn(N-k)=WNk(N—n)=WN—nk(3)利用这些特性,既可以使DFT中有些项合并,减少了乘法积项,又可以将长序列的DFT分解成几个短序列的DFT。FFT就是利用了旋转因子的对称性和周期性来减少运算量的。FFT的算法是将长序列的DFT分解成短序列的DFT.例如:N为偶数时,先将N点的DFT分解为两个N/2点的DFT,使复数乘法减少一半:再将每个N/2点的DFT分解成N/4点的DFT,使复数乘又减少一半,继续进行分解可以大大减少计算量。最小变换的点数称为基数,对于基数为2的FFT算法,它的最小变换是2点DFT。一般而言,FFT算法分为按时间抽取的FFT(DITFFT)和按频率抽取的FFT(DIFFFT)两大类。DIFFFT算法是在时域内将每一级输入序列依次按奇/偶分成2个短序列进行计算.而DIFFFT算法是在频域内将每一级输入序列依次奇/偶分成2个短序列进行计算。两者的区别是旋转因子出现的位置不同,得算法是一样的。在DIFFFT算法中,旋转因子WN出现在输入端,而在DIFFFT算法中它出现在输入端。假定序列x(n)的点数N是2的幂,按照DIFFFT算法可将其分为偶序列和奇序列。偶序列:x(2r)=x1(r)奇序列:x(2r+1)=x2(r)其中:r=0,1,2,…,N/2-1,则x(n)的DFT表示为式中,X1(k)和X2(k)分别为X1(r)和X2(r)的N/2的DFT.由于对称性,WNk+N/2=-WNk.因此,N点DFT可分为两部分:前半部分:x(k)=x1(k)+WkNx2(k)(4)后半部分:x(N/2+k)=x1(k)-WkNx2(k)k=0,1,…,N/2—1(5)从式(4)和式(5)可以看出,只要求出0~N/2—1区间x1(k)和x2(k)的值,就可求出0~N—1区间x(k)的N点值。以同样的方式进行抽取,可以求得N/4点的DFT,重复抽取过程,就可以使N点的DFT用上组2点的DFT来计算,这样就可以大减少运算量。基2DIFFFT的蝶形运算如图3.1所示。设蝶形输入为x1(k)和x2(k),输出为x(k)和x(N/2+K),则有x(k)=x1(k)+WkNx2(k)(6)x(N/2+k)=x1(k)-WkNx2(k)(7)在基数为2的FFT中,设N=2M,共有M级运算,每级有N/2个2点FFT蝶形运算,因此,N点FFT总共有MN/2个图3.1基2DIFFFT的蝶形运算例如:基数为2的FFT,当N=8时,共需要3级,12个基2DITFFT的蝶形运算。其信号流程如图3.2所示。x(0)x(0)WN0x(4)x(1)-1WN0x(2)x(2)-1WN0WN2x(6)x(3)-1—1WN0x(1)x(4)—1WN0WN1x(5)x(5)-1-1WN0WN2x(3)x(6)-1-1WN0WN2WN3x(7)x(7)-1—1—1图3。28点基2DIFFFT蝶形运算从图(b)可以看出,输入是经过比特反转的倒位序列,称为位码倒置,其排列顺序为x(0),x(4),x(2),x(6),x(1),x(5),x(3),x(7),输出是按自然顺序排列,其顺序为x(0),x(1),x(2),x(3),x(4),x(5),x(6),x(7).程序设计顺序DSP初始化DSP初始化串口设置AD设置串口设置AD设置功率谱计算观看转换结果,保存数据串口发送转换结果FFT运算位码倒置串口接收,AD采样设置信号源类型、频率幅值、和采样点数功率谱计算观看转换结果,保存数据串口发送转换结果FFT运算位码倒置串口接收,AD采样设置信号源类型、频率幅值、和采样点数四、FFT算法的DSP实现过程:DSP芯片的出现使FFT的实现方法变得更为方便。由于大多数DSP芯片都具有在单指令周期内完成乘法—累加操作,并且提供了专门的FFT指令,使得FFT算法在DSP芯片实现的速度更快.FFT算法可以分为按时间抽取FFT和按频率抽取FFT两大类,输入也有实数和复数之分,一般情况下,都假定输入序列为复数。(一)FFT运算序列的存储分配FFT运算时间是衡量DSP芯片性能的一个重要指标,因此提高FFT的运算速度是非常重要的。在用DSP芯片实现FFT算法时,应允许利用DSP芯片所提供的各种软、硬件资源。如何利用DSP芯片的有限资源,合理地安排好所使用的存储空间是十分重要的。(二)FFT运算的实现用TMS320C54x的汇编程序实现FFT算法主要分为四步:1。实现输入数据的比特反转输入数据的比特反转实际上就是将输入数据进行码位倒置,以便在整个运算后的输出序列是一个自然序列。在用汇编指令进行码位倒置时,使用码位倒置可以大大提高程序执行速度和使用存储器的效率。在这种寻址方式下,AR0存放的整数N是FFT点的一半,一个辅助寄存器指向一个数据存放的单元。当使用位码倒置寻址将AR0加到辅助寄存器时,地址将以位码倒置的方式产生。2.实现N点复数FFTN点复数FFT算法的实现可分为三个功能块,即第一级蝶形运算、第二级蝶形运算、第三级至log2对于任何一个2的整数幂,总可以通过M次分解最后成为2点的DFT计算。通过这样的M次分解,可构成M(即log2N)级迭代计算,每级由3。功率谱的计算用FFT计算想x(n)的频谱,即计算X(k)=X(k)一般是由实部XR(k)和虚部XlX(k)=XR(k)+jX因此,计算功率谱时只需将FFT变换好的数据,按照实部实部XR(k)和虚部Xl(k)求它们的平方和,然后对平方和进行开平方运算.但是考虑到编程的难度,对于求FFT变换后数据的最大值,不开平方也可以找到最大值,并对功率谱的结果没有影响,所以在实际的4.输出FFT结果(三)汇编语言程序程序主体由rfft-task、bit—rev、fft和power四个子程序组成。rfft—task:主调用子程序,用来调用其他子程序,实现统一的接口.bit-rev:位码倒置子程序,用来实现输入数据的比特反转.fft:FFT算法子程序,用来完成N点FFT运算。在运算过程中,为避免运算结果的溢出,对每个蝶形的运算结果右移一位。fft子程序分为三个功能块:第一级蝶形运算、第二级蝶形运算、第三级至至log2(四)正弦系数表和余弦系数表:正弦系数表和余弦系数表可以由数据文件coeff。inc给出,主程序通过.copy汇编命令将正弦和余弦系数表与程序代码汇编在一起。在本例中,数据文件coeff.inc给出1024复数点FFT的正弦、余弦系数各512个。利用此系数表可完成8~1024点FFT的运算。(五)FFT算法的模拟信号输入:FFT算法的模拟信号输入可以采用C语言编程来生成一个文本文件sindata,然后在rfft-task汇编程序中,通过。copy汇编命令将生成的数据文件复制到数据存储器中,作为FFT算法的输入数据参与FFT运算。这种方法的优点是程序的可读性强,缺点是当输入数据修改后,必须重新编译、汇编和链接。五、设计步骤:1.启动CCS,在CCS中建立一个C源文件和一个命令文件,并将这两个文件添加到工程,再编译并装载程序:阅读Dsp原理及应用中fft用dsp实现的有关程序。2.双击,启动CCS的仿真平台的配着选项。选择C5502Simulator。3.启动ccs2后建立工程文件FFT.pjt4.建立源文件FFT.c与链接文件FFT。cmd5。将这两个文件加到FFT.pjt这个工程中。6.创建out文件7.加载out文件六、编译程序intINPUT[SAMPLENUMBER],DATA[SAMPLENUMBER];floatfWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER];floatsin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER];voidInitForFFT(){inti;ﻩfor(i=0;i<SAMPLENUMBER;i++)ﻩ{ﻩﻩsin_tab[i]=sin(PI*2*i/SAMPLENUMBER);ﻩﻩcos_tab[i]=cos(PI*2*i/SAMPLENUMBER); }}voidMakeWave(){inti;ﻩfor(i=0;i〈SAMPLENUMBER;i++) { ﻩINPUT[i]=sin(PI*2*i/SAMPLENUMBER*3)*1024; }}main(){inti;ﻩInitForFFT(); MakeWave(); for(i=0;i<SAMPLENUMBER;i++){fWaveR[i]=INPUT[i];ﻩﻩfWaveI[i]=0。0f;w[i]=0。0f; }ﻩFFT(fWaveR,fWaveI);ﻩfor(i=0;i<SAMPLENUMBER;i++)ﻩ{ﻩﻩDATA[i]=w[i]; } while(1); //breakpoint}voidFFT(floatdataR[SAMPLENUMBER],floatdataI[SAMPLENUMBER]){ intx0,x1,x2,x3,x4,x5,x6,xx; inti,j,k,b,p,L; floatTR,TI,temp; /**********followingcodeinvertsequence************/ for(i=0;i<SAMPLENUMBER;i++) { ﻩx0=x1=x2=x3=x4=x5=x6=0;x0=i&0x01;x1=(i/2)&0x01;x2=(i/4)&0x01;x3=(i/8)&0x01;x4=(i/16)&0x01;x5=(i/32)&0x01;x6=(i/64)&0x01;ﻩ xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6; dataI[xx]=dataR[i];ﻩ}ﻩfor(i=0;i〈SAMPLENUMBER;i++)ﻩ{dataR[i]=dataI[i];dataI[i]=0;} for(L=1;L〈=7;L++)ﻩ{/*for(1)*/ ﻩb=1;i=L—1; while(i〉0) ﻩ{ ﻩ b=b*2;i--; ﻩ}/*b=2^(L-1)*/ﻩ for(j=0;j<=b—1;j++)/*for(2)*/ ﻩ{p=1;i=7-L;ﻩ ﻩwhile(i>0)/*p=pow(2,7—L)*j;*/ﻩﻩ {p=p*2;i-—; } ﻩ p=p*j;ﻩﻩﻩfor(k=j;k<128;k=k+2*b)/*for(3)*/ﻩ ﻩ{ ﻩ TR=dataR[k];TI=dataI[k];temp=dataR[k+b];ﻩﻩﻩ dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p]; ﻩﻩﻩdataI[k]=dataI[k]—dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p]; ﻩdataR[k+b]=TR-dataR[k+b]*cos_tab[p]—dataI[k+b]*sin_tab[p];ﻩ ﻩ dataI[k+b]=TI+temp*sin_tab[p]—dataI[

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论