ftp服务客户端设计资料_第1页
ftp服务客户端设计资料_第2页
ftp服务客户端设计资料_第3页
ftp服务客户端设计资料_第4页
ftp服务客户端设计资料_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

FTP客户端设计说明书客户端感觉上要比服务器端简单一些,其实不然。就我的开发体会而言,服务器端只要侦听21号端口,若有请求就打开控制通道,然后等待用户的命令做出相应的响应,并打开数据通道进行数据传输(目录列表或者文件),除了某些命令(例如USER和PASS),大部分的命令都是独立的,这就使得服务器端并不会存在复杂的有限状态机,特别是当我们并不需要实现其所有命令的时候(实际上我们实现了15条命令,具体见《协议说明书》)。而客户端则是根据功能需求向服务器端发出各种指令来完成的,但是一些稍复杂的功能,例如目录的下载(或上传),服务器端并不提供这条命令,但是我们可以通过发出一系列其服务器提供的命令的组合来达到这个效果,生成这个命令组合便是客户端需要做的事之一。这就有点像服务器提供少量〃机器指令”,客户端则用这些少量的〃机器指令”去〃搭积木”来完成功能需求。除此之外,客户端还要提供更多的图形元素,例如本地和远程的文件目录列表等。在我们这个客户端的设计中,我们共完成了登陆,退出,列目录,下载/上传文件,下载/上传目录,删除文件/目录,新建目录,断点续传以及传输过程中状态计算(比如下载速度,下载时间和剩余时间、传输进度百分比的计算等等)等功能,并通过多线程的方法使得整个软件不至于在下载或上传时出现由于某个函数的繁忙计算而导致界面〃死掉”的情况。由于我们是并行开发的,即我完成客户端,同时方超和单梦凡完成服务器端,所以我在开发时就没法用他们写的服务器端来进行测试。取而代之的是,我用了主流的FTP服务器端软件Serv-U来测试我写的客户端。二开发目标设计并实现一个符合标准FTP协议规范的,拥有登陆,退出,列目录,下载■建/上传文件,下载/上传目录,删除文件/目录,新建目录,断点续传■建程中状态计算等功能的FTP客户端软件。三,开发工具和平台VisualC++6.0,在WindowsXPSP3下开发。之所以选择VisualC++,是因为我本身对于VC的图形界面编程较为熟悉,相对而言对于java的图形界面的编程不是很熟悉(虽然java是以网络应用见长

的)。而不同的语言提供的socket接口又大体上差不多,所以我选择了VC来作为开发工具。,测试工具Serv-U6.3。正如上文所说我们是并行开发的,所以我的客户端只能通过连接现有的FTP服务端软件来测试,这里我选择了使用较广,操作方便的Serv-U。五、程序结构1)类定义classspecificationCAlienFTPClientDlg主对话框类,用于图形界面的处理,通过调用AlienFTPCmd类提供的函数实现与服务器的连接与交互。AlienFTPCmdFTP命令处理类该类主要负责实现功能需求的各种函数,供CAlienFTPClientDlg直接调用,同时也提供一些基本操作使CAlienFTPClientDlg可以通过这些操作的组合完成复杂的功能。GetDirName用于弹出对话框让用户输入待新建的目录的名称RmdDialog用于询问用户是否要删除一个远程的非空目录。2)主要类接口2.1CAlienFTPClientDlg类classmemberfunctionFindLocFile根据指定的本地路径将该路径下的文件以列表的形式在主对话框的ListControl中显示出来

OnInsertFile被FindLocFile调用,用于向表示当前的本地目录的ListControl插入一条目录/文件信息InsertServerFile用于向表示当前的远程目录的ListControl插入一条目录/文件信息GetFilelcon用于查找本地文件/目录的图标GetFileIcon2用于根据远程文件/目录的的文件类型在本机查找对应类型注册的图标RemoveLocalDirectory删除本地目录OnDblclkListLocal本地文件列表的双击响应事件函数,用户进入某个本地目录,并显示该目录里的文件列表OnButtonBacklocal本地文件列表的返回上一目录的响应函数OnButtonConnect与服务器连接的函数OnButtonLogoff与服务器断开的函数OnDblclkListServer远程文件列表的双击响应事件函数,用户进入某个远程目录,并显示该目录里的文件列表OnButtonBackserver远程文件列表的返回上一目录的响应函数OnDownload下载,在该函数中,将启动一个线程用于下载任务OnUpload上传,在该函数中,将启动一个线程用于上传任务OnLocalDel删除本地某个文件OnServerDel删除远程某个文件OnLocNewDir在本地的当前路径下新建目录OnSerNewDir在远程的当前路径下新建目录OnRefreshLoc刷新本地文件列表OnRefreshSer刷新远程文件列表2.2AlienFTPCmd类classmemberfunctionOpen打开命令通道Close关闭命令通道Order向服务器端发送一条命令Response接受服务器端的响应Command向服务器端发送一条命令并接受回应GetFileItem从服务器端发回的包含列表信息的数据中读取一条文件/目录信息

List向服务器端发送LIST命令并接受服务器端在数据通道传输过来的文件列表数据MoveFile用于单个文件的上传/下载LogOn登陆服务器LogOff断开服务器3)线程定义ThreadspecificationThreadTime定时器线程,用于下载/上传的已用时间,剩余时间的计算和显示ThreadStatus状态量计算线程,用于显示当刖传输文件名,已传输大小,平均下载速度,下载进度的计算和显示ThreadDownload下载线程,根据下载的是文件或目录进行相应的下载任务,在下载目录的时候,该线程还负责传输队列的显示和更新ThreadUpload上传线程,根据上传的是文件或目录进行相应的上传任务,在上传目录的时候,该线程还负责传输队列的显示和更新五■功能模块详细设计1)登陆登陆相对而言其他功能要简单得多,流程如下:

2)退出向服务器端发送“QUIT”命令即可。3)列目录列文件目录稍复杂点,但实际上也很简单,其复杂部分在于将服务器发过来的文件信息数据进行解析并得到相应的文件名,文件类型,文件大小,创建时间和权限等,处理流程如下:结束结束其中发送命令于接受回应已在上文解释过,下面我们探讨关于PORT命令、LIST命令和侦听的socket。在发送PORT命令之前要确保本地已经创建好了侦听socket,然后将该socket的地址和端口号转换为xxx,xxx,xxx,xxx,xxx,xxx(其中前四个xxx是将ip地址中的点换成逗号,后两个xxx实际上分别是port/256和port%256)作为PORT命令的参数发送给服务器端,服务器收到该条命令后会创建一个socket来连接我们已经在侦听的socket,这样,数据通道就建立好了。接着发送一条LIST命令,客户端便将当前远程目录下的文件信息从数据通道发送过来,我们对接受到的数据进行解析便可以得到每个文件/目录具体的信息,如文件名,文件类型,文件大小,创建时间和权限等。当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名。bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接

字号联系起来,即将名字赋予套接字,以指定本地半相关。参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。参数name是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。namelen表明了name的长度。在数据通路中进行数据的发送和接受要用到上文中介绍过的函数send和recv,其用法同上完全相同。4)下载文件下载文件是FTP最主要的功能之一,但实现起来,我感觉甚至比列目录还简单,因为下载文件对于在数据通道接受的数据并不需要处理而可以直接写进文件里。下载文件的流程如下:从数据通道

接受数据接受数据不

为空将数据写入文件从数据通道

接受数据接受数据不

为空将数据写入文件值得指出的是,之所以要多次接收数据是因为文件并不是一次性传输过来的,而是以长度为的4096的数据传输过来的。客户端每次从数据通道获取一部分数据并将其追写到已创建的文件里,直至接受数据失败。5)上传文件上传文件与下载文件及其类似,也有两种数据通道的建立方式,不过顺序颠倒了,客户端是从本地文件里每次读取长度为4096的数据,发送到数据通道,直至文件全部发送完毕。

上传文件的流程图如下:上传文件的流程图如下:6)下载目录鉴于下载文件的一系列步骤已在上文说明,下文中将直接使用“下载文件”来代表这一系列过程。下载目录要复杂一点了,因为服务器并没有提供下载目录的命令(实际上也没有必要提供该命令,一是因为如果将整个目录的文件在同一个数据通道一起发送过来,那么在本地用于将这些数据分解称单个的文件的开销可能会很大,二是因为下载目录可以通过基本FTP指令的组合来完成)7)上传目录上传目录与下载目录几乎差不多,也是设计了一个递归的算法来实现的,其函数为:voidUploadDirectory(localpath,dirname,serverpath);其中locpath为当前的本地路径,dirname为该路径下一个待上传的目录,serverpath为远程路径。8)删除文件直接使用命令DELEfilename实现。9)删除目录服务器端只提供删除空的目录,故若一个目录dirname为空,我们直接使用下面的命令来删除:RMDdirname。当待删除的目录非空时,我们会通过递归将其子目录下的所有文件

及目录删除,再删除该目录,算法类似于下载/上传目录的做法。10)新建目录直接使用命令MKDdirname实现。11)断点续传实现断点续传并没有我想象得那么难,因为服务器端提供了SIZE和REST指令,利用这两条指令结合上文我们已经分析过的下载和上传的过程,我们可以很轻松地实现断点续传(包括断点下载和断点上传)。RETR命令RETR命令得到待下载的远程文件*创建本地文件―►建立数据通道启动下载线程本地存在同名文

件,长度为L以追写方式打

开本地文件>建立数据通道>RESTL断点上传流程图:将本地文件指 |建十新辑、甬清令后移以追写方式打

开本地文件>建立数据通道>RESTL断点上传流程图:将本地文件指 |建十新辑、甬清令后移LT建立数据通道>RESTL12)状态计算我设计的几个状态包括平均下载速度,已用时间,剩余时间,传输进度还有在传输队列的显示。无论是上传还是下载,都会在启动传输线程的同时启动定时器线程ThreadTime和状态量线程ThreadStatus。在定时器线程ThreadTime中开始即时,通过sleep(1000)来实现,同时通过剩余传输大小和传输速度计算剩余时间。在状态量线程ThreadStatus中,不断刷新几个全局变量来获得当前文件已传输的大小,同时计算进度百分比,并更新进度条。附:实现结果,-I■-Ji.1.■.'E.I,-I■-Ji.1.■.'E.IJ

1]J1iL

IdlaIdlaIJIdKflM-2315:]a:L22MT-B-22E:3L.L2龄H31S:S::3£3M&-ML5.22.5lam12:3L:L4KflB-12-JZL5:26:呢2MB-HM1£3:35:9BE正估株E正估株袖席E[JTBtUPcnfCfl.坤瞄融如Eb等1H皋UH般检MJUT5lH“i.cm蝴晚故争Mfh3犊I7n>s*3:"27:Cl'y.icg'事汗TMEf::-廿会耕蠕[WESmJ□!.B«ilaric.no.sramfiWT.m*芾1HBSU5ffi^KBrj[]T.».U“i.cmJCTffi.mA等帝熊[W^SHT][JT.B«ll.:.pit,国.炊翌具故剽3.gB3轻E:取"27:cl'y.icg'事汗TME:::rt面蹿理mdT.gu球.no.繇H.Eb等1H崔Lm?SKJUTBr.lHarirCRJ.«?5邮故审。eA等 LWiSSBT][JT.Bi:llcpicno.CSIflraSfflS.mrt.'■1■:I'r'■1--:-r.■.TJ-I--■[B]USERKMrfVMua[fl]331Uiat

温馨提示

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

评论

0/150

提交评论