FTP客户端软件的设计与开发
- 格式:doc
- 大小:178.66 KB
- 文档页数:24
《网络协议分析》软件设计说明院系:组长姓名:组员姓名(工作量大的排在前面):年月软件名称:ftp客户端程序本小组设计了ftp客户端程序,拥有连接域名服务器、列表、上传、下载、打开以及创建目录和退出等功能。
本小组在上课时,觉得老师讲的ftp客户端功能有点单一,所以就想着能不能进一步的完善这个ftp客户端程序。
故本程序参考老师讲的课堂资料以及网上资料所开发出来的。
本程序首先设计一个FTP客户端的大致框架程序,包含有连接、列表和退出功能,再逐步完善,添加下载、上传、打开目录、创建目录和删除功能。
各个功能详细如下:1,链接: 建立套接字绑定,创建套接字。
本程序默认IP地址为127.0.0.1 ,默认用户名为a ,默认密码为1 。
2,查询:在教学平台下载的serv-U设置好相应的内容,默认域名和目录等等,若链接已经成功,则查询到该目录下的所有文件。
若链接不成功,则不能查询到相应目录。
3,下载:查询和链接成功后,可以在目录信息栏下选择相应文件(由于编程能力有限,只能选择不含子文件的文件下载,不能直接下载文件夹)进行下载,下载后命名由操作员定义,保存地址由操作员选择。
4,上传:若查询成功,则可以再相应目录文件夹以及其子文件夹内上传文件。
5,打开目录:链接和查询成功,可以打开查询到的目录下的各个文件以及该文件的各级子文件。
6,创建目录:链接和查询成功,可以在相应的目录下创建新的目录,若打开了该目录的各级文件,也可以在各级文件下创建目录。
文件名字由操作员命名。
7,删除:链接和查询成功,可以对目录下各个文件以及各级子文件进行删除。
(由于编写程序能力有限,不能直接删除大文件,即不能删除带有子文件的文件,有待研究改编)8,退出:操作完成,可直接退出程序的运行。
程序将断开对套接字的链接,目录信息栏下的内容清空。
功能总结:虽然删除功能不是很完善,无法递归删除,只能是空目录下删除。
但是操作界面清楚鲜明,其他各个功能基本上都是可以顺利完成,并且操作简单又可靠,整体来说功能实施得良好,当然还是有待改进。
FTP客户端软件的设计与实现摘要文件传输协议(File Transfer Protocol, FTP),它是目前Internet上使用得最广泛的文件传送协议。
起初,FTP并不是应用于IP网络上的协议,而是20世纪60~80年代美国国防部组建的ARPANET网络中,用于计算机间的文件传输的协议。
时至今日,FTP仍然保持其可靠性,高速地传输文件,它还允许文件远程存取。
这使得用户可以在某个系统上工作,而将文件存贮在别的系统。
为了用户更方便的使用FTP服务,提供更好的人机交互界面,本课题将使用JA V A以及JBuilder的ftpclient库,基于Client/Server的架构方式,编写一个友善界面的FTP客户端工具,实现服务器连接、远程与本地目录浏览、文件上传和下载等基本FTP工具常用功能。
关键词:FTP;上传;下载The Design and Implementation of FTP ClientAbstractFile Transfer Protocol (FTP), which is the most widely used protocol for transmission at present. In the beginning, the FTP is not used on the IP network, but used in the United States Department of Defense network for the computer file transfer agreement in the 1960's to 1980's. Today, FTP is maintaining its reliability, high-speed transmission of documents, it also allows remote access to documents, Users can manipulate data in other different system, to make users more convenient use FTP services, have a better man-machine interface, this system will be written by Java, JBuilder, and the ftpclient library. Basing on Client/Server structures, to prepare a FTP client tool with a friendly interface, it can login to the server, browse remote and local directory, upload and download.Key words:FTP; Upload; Download目录论文总页数:20页1 引言 (1)1.1选题背景 (1)1.2 选题目的 (1)2 相关基础技术与开发平台 (1)2.1 JAVA技术 (1)2.1.1 JAVA简介 (1)2.1.2 C/S架构简介 (2)2.2 FTP基础 (3)2.3 开发平台 (4)3系统需求分析与总体设计 (4)3.1 需求分析 (4)3.2 设计思路 (5)3.3实现思路 (5)4 系统模块的实现 (7)4.1 界面模块实现 (7)4.2 登录模块实现 (8)4.3 浏览程序 (10)4.3.1浏览服务器端目录程序 (10)4.3.2本地浏览程序 (12)4.4文件下载和上传程序 (13)4.4.1文件下载程序 (13)4.4.2文件上传程序 (13)5 系统测试及问题处理 (15)5.1测试环境 (15)5.2 测试结果 (15)5.2.1登录模块测试 (15)5.2.2系统兼容性测试 (16)5.3 测试总结 (16)结论 (17)参考文献 (18)致谢 (19)声明.................................................... 错误!未定义书签。
无忧无虑毕设网-大学生毕业设计站,免费毕业设计论文,无忧无虑毕设网大学生毕业设计,出售各类毕业设计源码,论文,程序源码,网站源码,免费视频教程,我们将竭诚为您服务!FTP客户端设计与实现摘要互联网的一大特点是实现信息共享,文件传输是信息共享的十分重要的内容之一。
随之出现了许多FTP服务器来共享一些信息资源,编写一个操作简单,方便的FTP客户端来下载这些资源受到了人们的极大欢迎。
FTP客户端软件是在了解FTP工作原理后,利用C#语言来设计和开发的。
FTP客户端分为连接模块、文件管理模块、文件传输模块和辅助管理模块。
连接模块实现主机与服务器的连接的功能;文件管理模块实现新建文件、删除文件等功能;文件传输模块实现主机与服务器连接成功后上传和下载文件功能。
辅助管理模块实现一些相关功能如:读写配置INI文件。
该FTP客户端软件达到了使用方便的目标,希望开发软件的经验能为使用.NET设计开发Windows应用程序FTP客户端软件的初学者提供一些帮助。
关键词:.NET;C#;文件传输协议;客户端The Design and Implementation of FTP ClientAbstractThe predominant characteristic of network is information resources sharing. Document transmission is an important component element. Because of this, many File Transfer Protocol (FTP) servers appeared, and won its way into favor.C# programming language is used to develop the FTP client software after comprehending the FTP working principle. And this FTP client software is made up of linking module、file management module、file transmission module and assisted management module. Linking module performs the functions of linking a host and a server; functions of operating on files are implemented in file management module; transmitting files is easy through applying file transmission module; assisted management module mainly performs the functions of reading and writing the INI files. This FTP client software is usable. And I hope the experience from this software development can do some help to the learners who'll devote their efforts to FTP client software development.Key words:.NET; C#; FTP, Client目录论文总页数:21页1引言 (1)1.1 课题背景 (1)1.2 国内外研究现状 (1)1.3 本课题研究的意义 (1)1.4 本课题的研究方法 (2)2技术背景 (2)2.1 .NET技术简介 (2)2.2 V ISUAL S 简介 (2)2.3 开发语言选择 (2)2.4 FTP简介 (3)2.5 FTP工作模式 (4)3FTP软件需求分析 (6)3.1 需要完成目标 (6)3.2 功能需求 (7)3.3 环境需求 (7)4 FTP软件详细设计与实现 (7)4.1 软件总体分析与设计 (7)4.2 各模块具体设计 (7)4.2.1 连接管理设计 (7)4.2.2 文件管理设计 (9)4.2.3 文件传输设计 (9)4.2.4 辅助功能设计 (10)4.3 模块的程序实现 (10)4.3.1 连接管理的程序实现 (10)4.3.2 文件管理的程序实现 (11)4.3.3 文件传输的程序实现 (12)4.3.4 辅助功能的程序实现 (13)5软件测试 (15)5.1 测试前分析 (15)5.2 测试的过程与分析 (15)5.3 测试小结 (17)结论 (18)参考文献 (19)致谢 (20)声明 (21)1引言1.1课题背景FTP是Internet上最早也是最广的应用,直到今天它仍是最重要和最基本的应用之一。
FTP客户端程序设计
一、实验目的
1.理解掌握TCP/IP协议的基本内容,熟练使用编程语言,设计协议的应用层的应用。
2.掌握套接字编程的基本步骤,设计程序流程,实现特定的网络应用服务。
3.掌握Windows/Linux操作系统下系统网络API的主要使用方式。
4.使用C/C++/JA V A/C#/VB等设计基于GUI用户应用进程的基本方式。
5.了解特定应用背景下网络服务的配置方式和使用方式。
二、实验截图
三、实验结果
四、心得体会
通过对该程序的编写我对MFC的操作更加的熟练了,同时了解了更多的控件知识。
而且通过此次的课程设计我对FTP的工作原理有了更加清楚的认识,对计算机网络的学习也有益处。
同时在此次的课程设计中我也遇到了很多问题,在同学和老师的帮助下也一一解决了,我也知道了自己的编程水平还很有限,还需要更加长远的学习。
在此次的课程设计中我也到图书馆中借阅了一些相关资料,也丰富了自己的课外知识。
XX大学毕业设计题目:FTP客户端软件的设计与实现指导教师:XXX职称:副教授学生姓名: XXX 学号: 201XXXXXXXXX 专业:计算机科学与技术院(系):信息工程学院完成时间: 2014 年 5 月 9 日2014 年 5 月 9 日FTP客户端设计与实现摘要信息时代的到来,信息的交流变得越来越重要,而信息的交流离不开文件的传输。
基于FTP的文件传输系统意在搭建一个文件传输平台,使其在安全、透明、快捷的环境下来进行文件传输。
网络上进行信息共享或文件传输,都是基于某种协议而进行的,FTP是人们在网络中进行文件传输普遍采用的一种协议。
系统使用流行的Java作为开发语言,采用C/S模式作为网络结构,利用套接字编程实现多线程传输。
论文首先对现在常用的FTP进行了分析,然后介绍了系统的需求分析和设计过程,给出了服务器和客户端的功能模块及总体流程,最后给出了网络文件传输系统服务器和客户端的编码实现,并对系统各个功能的实现进行了测试,分析优缺点和总结。
通过测试,该系统实用、界面简单,能进行文件上传和下载并支持多线程,是一个比较好的文件传输系统。
关键词:文件传输协议,TCP/IP,多线程,套接字Design and implementation of an FTP clientAbstractThe arrival of the information age, the exchange of information is becoming increasingly important, and the exchange of information can not be separated file transfer . FTP-based file transfer system is intended to set up a file transfer platform , so in a safe , transparent and efficient environment down the file transfer.Information sharing on a network or file transfer , are carried out based on a protocol , FTP is a protocol for file transfer people to be widely used in the network. The system uses the popular Java as a development language , using C / S mode as the network structure , the use of socket programming multithreaded transfers.Firstly, on the now commonly used FTP analyzed, and then introduced the system requirements analysis and design process , gives the server and client modules and the overall process . Finally, network file transfer server and client code implementation, and realization of various functions system has been tested , analyzed and summarized the advantages and disadvantages .Through testing, the system is practical , simple interface , files can be uploaded and downloaded and supports multi-threading , is a good file transfer system . Keywords : file transfer protocol , TCP / IP, multi-threaded, socket目录第1章绪论 (6)1.1 课题背景 (6)1.2 课题现状 (7)1.3 本文组织方式 (8)第2章开发工具及关键技术 (8)2.1 开发工具 (8)2.2 关键技术 (10)2.2.1 C/S架构简介 (10)2.2.2 SOCKET网络编程 (11)2.2.3 FTP协议简介 (11)第3章客户端文件传输系统设计 (13)3.1客户端需求分析 (13)3.1.1 用户需求 (13)3.1.2 功能需求 (13)3.1.3 性能需求 (13)3.2客户端设计 (14)3.2.1 客户端整体模块 (14)3.2.2 客户端流程划分 (15)3.3 ftpclient类 (16)3.4实现思路 (17)第4章文件传输系统的实现 (18)4.1 界面模块实现 (18)4.2 登录界面实现 (18)4.3 浏览程序 (24)4.3.1浏览服务器端目录程序 (24)4.4 文件的上传与下载 (27)4.4.1文件下载程序 (27)4.4.2文件上传程序 (27)第5章系统测试及问题处理 (35)5.1测试环境 (35)5.2 测试结果 (36)5.2.1登录模块测试 (36)5.2.2系统兼容性测试 (36)5.3 测试总结 (36)结论 (38)参考文献 (39)致谢 (40)声明 (41)第1章绪论1.1 课题背景随着Internet在全世界的普及和发展,越来越多的用户将自己的计算机连入这个人类有史以来最庞大的网络中。
Java课程设计-FTP客户端-说明书编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(Java课程设计-FTP客户端-说明书)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为Java课程设计-FTP客户端-说明书的全部内容。
摘要FTP是Internet上最早也是最广的应用,直到今天它仍是最重要和最基本的应用之一.用FTP将信息下载到本地是一件十分普遍的事。
也随之出现了许多下载软件。
尽管远程登录(Telnet)提供了访问远程文件的极好方法,但怎么也比不上使用自己计算机中的文件方便。
如果用户想使用其它计算机上的文件,最理想的方法就是把它COPY到自己的计算机中,以便在本地计算机上操作。
FTP正是完成这项工作的工具,你可以在任意一个经过文件传输协议(FTP)访问的公共有效的联机数据库或文档中找到你想要的任何东西. FTP是Internet上用来传送文件的协议.它是为了我们能够在Internet上互相传送文件而制定的文件传送标准,规定了Internet上文件如何传送。
通过FTP协议,我们就可以跟Internet上的FTP服务器进行文件的上传或下载。
本文以实现一个简单易用的FTP客户端为目标,通过分析FTP协议的基本工作原理和FTP的数据传输原理,研究如何使用Java工具对FTP 客户端进行设计,选择Java类库中的ftpclient类来实现FTP客户端程序的上传下载等主要功能。
关键字:Ftp客户端、FTP协议、工作原理、上传下载目录引言。
.。
..。
.。
....。
....。
...。
.。
.。
......。
.。
.。
...。
..。
.......。
课题五 FTP客户端程序设计一、课程设计目的:掌握FTP协议内容,理解FTP会话过程,掌握常用的FTP命令。
二、课程设计任务:基本要求:1.根据FTP会话过程设计程序的流程2.实现目录浏览、下载、上传文件等功能3.FTP服务器可用现有的IIS或其他FTP服务器三、设计方案FTP使用两个熟知TCP端口:端口21用做控制连接,用于发送指令给服务器及等待服务器响应;而端口20用于数据连接,建立数据传输通道。
在FTP会话的整个交互过程中,控制连接始终出于连接状态。
数据连接则在每一次文件传送时,先打开然后关闭。
每当涉及到文件传送的命令被使用时,数据连接就被打开,而当文件传送完毕时连接就关闭。
换言之,当用户开始一个FTP会话时,控制连接就打开。
在控制连接出于打开状态时,若传送多个文件,则数据连接可以打开和关闭多次。
两个FTP连接(控制和数据)使用不同的策略和不同的端口号。
创建控制连接有两个步骤:1.服务器在熟知端口21发出被动打开命令,等待客户;2.客户使用临时端口发出主动打开命令。
创建数据连接有三个步骤:1.客户使用一个临时端口发出被动打开,这必须由客户来做,因为是客户发出传送文件的命令;2.客户使用PORT命令把这个端口号发送给服务器;3.服务器收到这个端口号,并使用熟知端口20和收到的临时端口号发出主动打开。
本次课程设计,主要围绕FTP客户端的主要功能模块的设计,客户端的界面设计,三个主要功能模块展开。
1.实验环境程序设计中主要使用JAVA语言编写,在本地主机上安装服务器软件作为后台服务器。
我使用的是Serv-U软件搭建服务器。
Serv-U使用方便,操作简单,可以满足初级使用者的需求。
在JAVA的FtpClient 类中封装了FTP 协议的相关指令与实现细节,提供了一系列的方法,这些方法涵盖了几乎所有FTP的功能使用FtpClient类设计FTP客户端程序可以让编程人员轻松地实现登录远程FTP 服务器、浏览服务器上的目录、设置传输协议、上传文件和下载文件等功能。
FTP客户端的设计与实现1. 简介FTP(File Transfer Protocol)是一种用于文件传输的标准协议。
FTP客户端是指使用FTP协议与FTP服务器进行通信并传输文件的程序。
在本文中,我们将探讨FTP客户端的设计与实现。
2. 设计2.1 功能需求FTP客户端的主要功能需求包括:1.连接到FTP服务器2.在FTP服务器和本地电脑之间传输文件3.列出FTP服务器上的文件和目录4.创建和删除FTP服务器上的目录5.重命名FTP服务器上的文件6.支持多种操作系统(如Windows、Linux等)2.2 架构设计FTP客户端采用MVC(Model-View-Controller)模式来设计,其中:•Model层:管理FTP客户端的业务与数据逻辑。
提供FTP相关的API,封装了FTP协议的底层实现。
•View层:处理和呈现用户界面。
•Controller层:处理用户请求,调用Model层实现相关业务逻辑。
2.3 技术选型FTP客户端的技术选型如下:•编程语言:Java•GUI框架:JavaFX•FTP库:Apache Commons Net•构建工具:Maven•版本控制:Git2.4 待解决问题FTP客户端在设计中会遇到以下问题:1.如何扩展支持更多的FTP协议?2.如何实现可靠的文件传输?3.如何提高用户界面的体验?3. 实现3.1 界面实现使用JavaFX框架实现FTP客户端的用户界面。
主要界面包括:•登录界面:输入FTP服务器地址、用户名和密码登录FTP服务器。
•主界面:显示FTP服务器上的文件和目录,并提供文件传输和操作的操作界面。
3.2 功能实现FTP客户端通过Apache Commons Net库实现FTP底层协议。
实现的功能包括:1.连接到FTP服务器FTPClient ftp = new FTPClient();ftp.connect(server, port);ftp.login(username, password);2.在FTP服务器和本地电脑之间传输文件ftp.retrieveFile(remoteFile, localFile);ftp.storeFile(remoteFile, localFile);3.列出FTP服务器上的文件和目录FTPFile[] files = ftp.listFiles(remoteDir);4.创建和删除FTP服务器上的目录ftp.mkd(remoteDir);ftp.rmd(remoteDir);5.重命名FTP服务器上的文件ftp.rename(from, to);4. 总结通过对FTP客户端的设计与实现,我们了解了FTP协议的底层实现和FTP客户端的主要功能。
FTP客户端的设计与实现摘要:FTP(File Transfer Protocol)即文件传输协议是TCP/IP协议族中的一个应用层协议。
FTP客户端利用TCP的可靠传输服务,减少了不同文件系统间的不兼容性,实现了文件的传送功能;而且它提供了直观的文件传输操作方式,用户只需要使用鼠标拖动选择就可以完成相关操作。
文章主要介绍了FTP的相关知识、Visual Basic各种控件以及Windows API函数的调用等内容。
在此基础上文章最后介绍了如何使用VB完成FTP客户端应用程序的开发。
关键词:VB ; FTP ; Windows API0 引言FTP(File Transfer Protocol)协议即文件传输协议是TCP/IP体系结构中的一个重要协议,专门用于局域网或Internet中服务器和客户端之间进行文件传输。
FTP协议利用TCP的可靠传输服务,减少了不同文件系统间的不兼容,实现了文件的传送功能。
FTP极大的丰富了我们的网络生活,成为互联网上不可缺少的服务方式之一[1]。
1 设计内容FTP使用客户/服务器方式,本课题就是设计一个FTP客户端程序,其具有以下基本功能:能完成FTP链接的打开和关闭;能实现本地和远程目录的浏览;能执行文件的上传和下载等有关操作。
2 开发工具简介2.1 Visual Basic简介Basic 发展到今天已经有很多版本,如 GW-Basic 、QBasic 、Visual Basic 等等。
其中Visual Basic 是最容易学习与应用的程序语言之一,而且其功能也非常强大。
Visual Basic 6.0自带的一些功能控件可以帮助我们实现网络通信的功能,是我们网络编程中的一个重要的编程工具。
2.2 Windows API函数介绍Win32 API也就是Microsoft Windows 32位平台的应用程序编程接口。
Windows API可以提供形形色色的服务,凡是在Windows操作系统环境下开发的应用程序,都可以调用Windows API。
一、设计思想本软件了解通过FTP协议传送文件的方法,学会使用C#实现一个简单的FTP客户端。
随着计算机网络的完善和成熟人们通过FTP下载资源也普遍增加,特别是对于局域网用户,FTP服务器大大方便了同学们共享资源。
FTP协议(File Transfer Protocol)即远程文件传输协议,是一个用于简化IP网络上系统之间文件传送的协议,FTP是TCP/IP的一种具体应用,它工作在OSI模型的第 7层,TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,FTP建立的就是一个可靠的连接。
采用FTP协议可使 Internet用户高效地从网上的FTP服务器下载大信息量的数据文件,将远程主机上的文件拷贝到自己的计算机上。
以达到资源共享和传递信息的目的。
由于FTP 的使用使得Internet上出现大量为用户提供的下载服。
Internet成为了一个巨型的软件仓库。
将使用两条单独的TCP连接,一条专用于发送FTP命令,称为控制连接,另一条则专用于传递数据, 称为数据连接。
1)控制连接客户端希望与FTP服务器建立上传下载的数据传输时,它首先向服务器的TCP 21端口发起一个建立连接的请求,FTP服务器接受来自客户端的请求,完成连接的建立过程,这样的连接就称为FTP控制连接。
2)数据连接FTP控制连接建立之后,即可开始传输文件,传输文件的连接称为FTP数据连接。
FTP 数据连接就是FTP传输数据的过程,它有两种传输模式PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。
于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。
于是客户端向服务器的XXXX 端口发送连接请求,建立一条数据链路来传送数据。
从根本上说,FTP协议就是在网络中各种不同的计算机之间按照TCP/IP协议来传输文件。
FTP协议采用客户机/服务器 (Client/Sever)模式,由FTP客户端程序和FTP服务器端程序组成。
使用时,先启动FTP客户端程序与远程主机建立连接,然后向远程主机发出传输命令,远程主机在收到命令后就给予响应,并执行正确的命令。
但是FTP有一个根本的限制,那就是,如果用户在某个主机上没有注册获得授权,即没有用户名和口令,就不能与该主机进行文件传输。
但匿名FTP服务器除外,它能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。
用户使用特殊的用户名“Anonymous”或“guest”就可有限制地访问远程主机上公开的文件。
现在许多系统要求用户将Emai1地址作为口令,以便更好地对访问者进行跟踪。
出于安全的目的,大部分匿名FTP主机一般只允许远程用户下载(download)文档。
FTP是Internet上用来传送文件的协议。
它是为了我们能够在Internet上互相传送文件而制定的文件传送标准,规定了Internet上文件如何传送。
通过FTP协议,我们就可以跟Internet上的FTP服务器进行文件的上传或下载。
本软件以实现一个简单易用的FTP客户端为目标,通过分析FTP协议的基本工作原理和FTP的数据传输原理,研究如何使用Visual Studio 2010工具对FTP客户端进行设计,用Visual Studio 2010编程工具设计和实现了FTP服务与客户端设计,从而实现了对FTP客户端的开发。
二、算法流程图图1 系统的整体框架图图2 客户端连接流程图FTP 客户端软件登陆模块上传 下载 删除创建目录 刷新用户输入服务器地址、用户名密码及端口号查询服务器判断 在显示目录文件列表显示文件进行错误处理是 否图3 上传模块流程图三、源代码下面给出的是用程序FTPClient.cs 中的源代码:using System; //导入名字空间using ;using System.Collections.Generic; //包含定义各种对象集合的接口和类 using System.IO;using System.Text; //包含表示 ASCII 等字符编码的类 using .Sockets;using System.Windows.Forms;namespace myftp //命名空间{public class ftpStrPrase{ //定义一个类#region 文件属性点击上传按钮弹出文件选择对话框判断 弹出文本框 显示上传成功弹出文本框显示上传失败是否选择需要上传的文件/// <summary> //运行时生成相应的文档信息/// 保存含扩展名的文件/// </summary>private String _fullname; //保存含扩展名的文件public String Fullname{get { return _fullname; }set { _fullname = value; }}/// <summary> //运行时生成相应的文档信息/// 文件/目录名/// </summary>private String _filename;public String Filename //文件/目录名{get { return _filename; }set { _filename = value; }}/// <summary> //运行时生成相应的文档信息/// 扩展名/// </summary>private String _ext;public String Ext //扩展名{get { return _ext; }set { _ext = value; }}/// <summary> //运行时生成相应的文档信息/// 文件类型f /d/// </summary>private String _type = "f";public String Type // 文件类型{get { return _type; }set { _type = value; }}/// <summary> //运行时生成相应的文档信息///文件大小/// </summary>private Int32 _size = 0;public Int32 Size //文件大小{get { return _size; }set { _size = value; }}#endregionpublic ftpStrPrase(String toPrase,String osVer){Int32 iStartPos = 50; //定义iStartPos if (toPrase.Length < 51) //判断参数长度{return;}for (; toPrase[iStartPos] != ' ' ; ++iStartPos);_fullname = toPrase.Substring(iStartPos, toPrase.Length - iStartPos-1).Trim();//检索子字符串_filename = _fullname;_ext = "";_type = Convert.ToString( toPrase[0]=='d'?'d':'f'); //转换数据类型if (!_type.Equals("d")) //判断文件类型{Int32 dotPos = _stIndexOf(".") + 1; //报告索引位置if(dotPos>0){_ext = _fullname.Substring(dotPos, _filename.Length - dotPos); //_filename = _fullname.Substring(0, dotPos - 1);}Int32 sStartPos=31,sEndPos=0; //定义变量for (; toPrase[sStartPos] == ' '; ++sStartPos);for (sEndPos = sStartPos; toPrase[sEndPos + 1] != ' '; ++sEndPos);_size= Int32.Parse(toPrase.Substring(sStartPos, sEndPos - sStartPos+1));}}public void test(){MessageBox.Show("filename:" + _filename + ",ext:" + _ext + ",type:" + _type );//显示消息框}}/// <summary> //运行时生成相应的文档信息/// FTPClient 的摘要说明。
/// </summary>public class FTPClient // FTPClient 的摘要说明{#region 构造函数/// <summary> //运行时生成相应的文档信息/// 缺省构造函数/// </summary>public FTPClient() //缺省构造函数{strRemoteHost = ""; //IPstrRemotePath = ""; //目录strRemoteUser = ""; //用户名strRemotePass = ""; //密码strRemotePort = 21; //端口bConnected = false; //是否登录}/// <summary> //运行时生成相应的文档信息/// 构造函数/// </summary>public FTPClient(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort ) //构造函数{strRemoteHost = remoteHost;strRemotePath = remotePath;strRemoteUser = remoteUser;strRemotePass = remotePass;strRemotePort = remotePort;Connect(); //建立连接}#endregion#region 登陆/// <summary> //运行时生成相应的文档信息/// FTP服务器IP地址/// </summary>private string strRemoteHost;public string RemoteHost //FTP服务器IP地址{get{return strRemoteHost; //返回ip地址}set{strRemoteHost = value;}}/// <summary> //运行时生成相应的文档信息/// FTP服务器端口/// </summary>private int strRemotePort;public int RemotePort // FTP服务器端口{get{return strRemotePort; //返回端口号}set{strRemotePort = value;}}/// <summary> //运行时生成相应的文档信息/// 当前服务器目录/// </summary>private string strRemotePath; //当前服务器目录public string RemotePath{get{return strRemotePath; //返回目录}set{strRemotePath = value;}}/// <summary> //运行时生成相应的文档信息/// 登录用户账号/// </summary>private string strRemoteUser;public string RemoteUser //登录用户账号{set{strRemoteUser = value; //返回用户名}}/// <summary> //运行时生成相应的文档信息/// 用户登录密码/// </summary>private string strRemotePass; //用户登录密码public string RemotePass{set{strRemotePass = value;}}/// <summary> //运行时生成相应的文档信息/// 是否登录/// </summary>private Boolean bConnected;public bool Connected //是否登录{get{return bConnected;}}#endregion#region 连接操作/// <summary> //运行时生成相应的文档信息/// 建立连接/// </summary>public void Connect() //建立连接{socketControl = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);//开始连接try{socketControl.Connect(ep);}catch(Exception){throw new IOException("Couldn't connect to remote server");} //获取应答码ReadReply();if(iReplyCode != 220){DisConnect();throw new IOException(strReply.Substring(4));} //登陆SendCommand("USER "+strRemoteUser);if( !(iReplyCode == 331 || iReplyCode == 230) ){CloseSocketConnect(); //关闭连接throw new IOException(strReply.Substring(4));}if( iReplyCode != 230 ){SendCommand("PASS "+strRemotePass);if( !(iReplyCode == 230 || iReplyCode == 202) ){CloseSocketConnect(); //关闭连接throw new IOException(strReply.Substring(4));}SendCommand("SYST");if (strReply.ToUpper().Contains("NIX")){_OSVer = "linux";}else{_OSVer = "winxp";}}bConnected = true; //切换到目录ChDir(strRemotePath);}/// <summary> //运行时生成相应的文档信息/// 关闭连接/// </summary>public void DisConnect() //关闭连接{if( socketControl != null ){SendCommand("QUIT");}CloseSocketConnect();}#endregion#region //传输模式/// <summary> //运行时生成相应的文档信息/// 传输模式:二进制类型、ASCII类型/// </summary>public enum TransferType {Binary,ASCII}; //传输模式:二进制类型、ASCII类型/// <summary>/// 设置传输模式/// </summary>/// <param name="ttType">传输模式</param>public void SetTransferType(TransferType ttType) //设置传输模式{if(ttType == TransferType.Binary){SendCommand("TYPE I") ; //binary类型传输}else{SendCommand("TYPE A"); //ASCII类型传输}if (iReplyCode != 200){throw new IOException(strReply.Substring(4)); //初始化}else{trType = ttType;}}/// <summary> //运行时生成相应的文档信息/// 获得传输模式/// </summary>/// <returns>传输模式</returns>public TransferType GetTransferType() //获得传输模式{return trType;}#endregion#region 文件操作/// <summary> //运行时生成相应的文档信息/// 获得文件列表/// </summary>/// <param name="strMask">文件名的匹配字符串</param>/// <returns></returns>public string[] Dir(string strMask){//建立链接if(!bConnected){Connect(); //建立进行数据连接的socket}Socket socketData = CreateDataSocket(); //传送命令SendCommand("LIST " + strMask); //分析应答代码if(!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226)){throw new IOException(strReply.Substring(4));} //获得结果strMsg = "";while(true){int iBytes = socketData.Receive(buffer, buffer.Length, 0);strMsg += gb.GetString(buffer, 0, iBytes);if(iBytes < buffer.Length){break;}}char[] seperator = {'\n'};string[] strsFileList = strMsg.Split(seperator);socketData.Close(); //数据socket关闭时也会有返回码if(iReplyCode != 226){ReadReply();if(iReplyCode != 226){throw new IOException(strReply.Substring(4));}}return strsFileList;}/// <summary> //运行时生成相应的文档信息/// 获得文件详细列表,ZC添加./// </summary>/// <param name="strMask">文件名的匹配字符串</param>/// <returns>List<ftpStrPrase>一个解析返回字符串的List</returns>public List<ftpStrPrase> eDir(String strMask){//建立链接if (!bConnected){Connect(); //建立进行数据连接的socket }Socket socketData = CreateDataSocket(); //传送命令SendCommand("LIST " + strMask); //分析应答代码if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226)){throw new IOException(strReply.Substring(4));} //获得结果strMsg = "";while (true){int iBytes = socketData.Receive(buffer, buffer.Length, 0); //定义局部变量strMsg += gb.GetString(buffer, 0, iBytes); //服务器返回的应答信息if (iBytes < buffer.Length){break;}}char[] seperator = { '\n' }; //定义seperatorString[] strsFileList = strMsg.Split(seperator); //定义strsFileListList<ftpStrPrase> flist = new List<ftpStrPrase>(); //初始化foreach (String toParseStr in strsFileList){if(toParseStr.Trim().Length>=51){ftpStrPrase fsp = new ftpStrPrase(toParseStr,_OSVer);if(fsp.Filename.Length>0) //比较文件名字符数flist.Add(fsp); //将对象添加到结尾处}}bool isChangeDirDotIn = false; //布尔值设为假for (Int32 iPos = 0; iPos < flist.Count;++iPos ){if(flist[iPos].Filename.Equals("..")) //判断文件名的值isChangeDirDotIn = true;}if(isChangeDirDotIn==false) //如果布尔值为假{ftpStrPrase fsp = new ftpStrPrase("drw-rw-rw- 1 user group 0 Jun 17 11:02 ..\r",_OSVer); flist.Add(fsp); //将对象添加到结尾处}socketData.Close(); //数据socket关闭时也会有返回码if (iReplyCode != 226){ReadReply();if (iReplyCode != 226) //如果返回应答码不为226{throw new IOException(strReply.Substring(4)); //初始化}}return flist;}/// <summary> //运行时生成相应的文档信息/// 获取文件大小/// </summary>/// <param name="strFileName">文件名</param>/// <returns>文件大小</returns>private long GetFileSize(string strFileName) //获取文件大小{if(!bConnected) //建立链接{Connect();}SendCommand("SIZE " + Path.GetFileName(strFileName)); //发送命令并获取应答码long lSize=0;if(iReplyCode == 213) //判断应答码是否为213{lSize = Int64.Parse(strReply.Substring(4)); //转换字符串类型}else{throw new IOException(strReply.Substring(4)); //初始化}return lSize;}/// <summary> //运行时生成相应的文档信息/// 删除/// </summary>/// <param name="strFileName">待删除文件名</param>public void Delete(string strFileName) //删除{if(!bConnected) //建立链接{Connect();}SendCommand("DELE "+strFileName); //发送命令并获取应答码if(iReplyCode != 250){throw new IOException(strReply.Substring(4));}}/// <summary> //运行时生成相应的文档信息/// 重命名(如果新文件名与已有文件重名,将覆盖已有文件)/// </summary>/// <param name="strOldFileName">旧文件名</param>/// <param name="strNewFileName">新文件名</param>public void Rename(string strOldFileName,string strNewFileName){if(!bConnected) //建立连接{Connect();}SendCommand("RNFR "+strOldFileName); //发送命令并获取应答码if(iReplyCode != 350){throw new IOException(strReply.Substring(4));}//如果新文件名与原有文件重名,将覆盖原有文件SendCommand("RNTO "+strNewFileName);if(iReplyCode != 250){throw new IOException(strReply.Substring(4)); //初始化}}#endregion#region 上传和下载/// <summary> //运行时生成相应的文档信息/// 下载一批文件/// </summary>/// <param name="strFileNameMask">文件名的匹配字符串</param>/// <param name="strFolder">本地目录(不得以\结束)</param>public void Get(string strFileNameMask,string strFolder){if(!bConnected) //建立连接{Connect();}string[] strFiles = Dir(strFileNameMask);foreach(string strFile in strFiles){if(!strFile.Equals("")) //一般来说strFiles的最后一个元素可能是空字符串{Get(strFile,strFolder,strFile); //下载一个文件}}}/// <summary> //运行时生成相应的文档信息/// 下载一个文件/// </summary>/// <param name="strRemoteFileName">要下载的文件名</param>/// <param name="strFolder">本地目录(不得以\结束)</param>/// <param name="strLocalFileName">保存在本地时的文件名</param>public void Get(string strRemoteFileName,string strFolder,string strLocalFileName){if(!bConnected) //建立连接{Connect();}SetTransferType(TransferType.Binary); //设置传输模式if (strLocalFileName.Equals("")){strLocalFileName = strRemoteFileName;}if(!File.Exists(strLocalFileName)){Stream st = File.Create(strLocalFileName); //提供视图st.Close(); //关闭资源}FileStream output = new //公开StreamFileStream(strFolder + "\\" + strLocalFileName,FileMode.Create);Socket socketData = CreateDataSocket();SendCommand("RETR " + strRemoteFileName);if(!(iReplyCode == 150 || iReplyCode == 125|| iReplyCode == 226 || iReplyCode == 250))//判断应答码{throw new IOException(strReply.Substring(4)); //初始化}while(true){int iBytes = socketData.Receive(buffer, buffer.Length, 0);output.Write(buffer,0,iBytes); //写入字节块if(iBytes <= 0){break; //中断}}output.Close(); //释放资源if (socketData.Connected){socketData.Close(); //关闭socket连接并释放资源}if(!(iReplyCode == 226 || iReplyCode == 250)) //判断应答码{ReadReply(); //记录应答码if(!(iReplyCode == 226 || iReplyCode == 250)){throw new IOException(strReply.Substring(4)); //初始化}}}/// <summary> //运行时生成相应的文档信息/// 上传一批文件/// </summary>/// <param name="strFolder">本地目录(不得以\结束)</param>/// <param name="strFileNameMask">文件名匹配字符(可以包含*和?)</param>public void Put(string strFolder,string strFileNameMask){string[] strFiles = Directory.GetFiles(strFolder,strFileNameMask);foreach(string strFile in strFiles){//strFile是完整的文件名(包含路径) Put(strFile); //上传文件}}/// <summary> //运行时生成相应的文档信息/// 上传一个文件/// </summary>/// <param name="strFileName">本地文件名</param>public void Put(string strFileName){if(!bConnected){Connect(); //建立连接}Socket socketData = CreateDataSocket(); //建立连接的socketSendCommand("STOR "+Path.GetFileName(strFileName));if( !(iReplyCode == 125 || iReplyCode == 150) ) //判断应答码{throw new IOException(strReply.Substring(4)); //初始化}FileStream input = newFileStream(strFileName,FileMode.Open); //使用新实例int iBytes = 0;while ((iBytes = input.Read(buffer,0,buffer.Length)) > 0) //读取字节块并判断{socketData.Send(buffer, iBytes, 0); //将数据发送到socket}input.Close(); //释放资源if (socketData.Connected){socketData.Close(); //关闭socket并释放资源}if(!(iReplyCode == 226 || iReplyCode == 250)) //判断应答码{ReadReply(); //记录应答码if(!(iReplyCode == 226 || iReplyCode == 250)){throw new IOException(strReply.Substring(4)); //初始化}}}#endregion#region 目录操作/// <summary> //运行时生成相应的文档信息/// 创建目录/// </summary>/// <param name="strDirName">目录名</param>public void MkDir(string strDirName){if(!bConnected){Connect(); //建立连接}SendCommand("MKD "+strDirName); //发送命令并获取应答码if (iReplyCode != 257 && iReplyCode != 250 ){throw new IOException(strReply.Substring(4)); //初始化}}/// <summary> //运行时生成相应的文档信息/// 删除目录/// </summary>/// <param name="strDirName">目录名</param>public void RmDir(string strDirName) //定义RmDir{if(!bConnected){Connect(); //建立连接}SendCommand("RMD "+strDirName); //发送命令并获取应答码if(iReplyCode != 250){throw new IOException(strReply.Substring(4)); //初始化}}/// <summary> //运行时生成相应的文档信息/// 改变目录/// </summary>/// <param name="strDirName">新的工作目录名</param>public void ChDir(string strDirName) //定义ChDir{if(strDirName.Equals(".") || strDirName.Equals("")){return;}if(!bConnected) //是否登录{Connect(); //建立连接}SendCommand("CWD " + strDirName); //发送命令并获取应答码if (iReplyCode==550){MessageBox.Show("文件不存在或者权限不允许!","Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);//显示消息框}if(iReplyCode != 250){throw new IOException(strReply.Substring(4)); //初始化}this.strRemotePath = strDirName;}#endregion#region 内部变量/// <summary>/// //服务器返回的应答信息(包含应答码) /// </summary>private string strMsg;/// <summary>/// //服务器返回的应答信息(包含应答码) /// </summary>private string strReply;/// <summary>/// //服务器返回的应答码/// </summary>private int iReplyCode;public int IReplyCode{get { return iReplyCode; }}/// <summary>/// //进行控制连接的socket/// </summary>private Socket socketControl;/// <summary>/// //传输模式/// </summary>private TransferType trType;/// <summary>/// //接收和发送数据的缓冲区/// </summary>private static int BLOCK_SIZE = 512;Byte[] buffer = new Byte[BLOCK_SIZE];/// <summary>/// //编码方式/// </summary>Encoding ASCII = Encoding.ASCII;Encoding gb = Encoding.GetEncoding("gb2312");/// <summary>/// //服务器操作系统版本/// </summary>private String _OSVer = "winxp";public String OSVer //定义OSVer{get { return _OSVer; }set { _OSVer = value; }}#endregion#region 内部函数/// <summary>/// //将一行应答字符串记录在strReply和strMsg /// //应答码记录在iReplyCode/// </summary>private void ReadReply(){strMsg = "";strReply = ReadLine(); //读取socket返回的字符串iReplyCode = Int32.Parse(strReply.Substring(0,3));}/// <summary>/// 建立进行数据连接的socket/// </summary>/// <returns>数据连接socket</returns>private Socket CreateDataSocket() //建立进行数据连接的socket{SendCommand("PASV"); //发送命令并获得应答码if(iReplyCode != 227){throw new IOException(strReply.Substring(4)); //初始化}int index1 = strReply.IndexOf('(');int index2 = strReply.IndexOf(')');string ipData =strReply.Substring(index1+1,index2-index1-1); //检索字符串int[] parts = new int[6];int len = ipData.Length; //获取字符数int partCount = 0;string buf="";for (int i = 0; i < len && partCount <= 6; i++){char ch = Char.Parse(ipData.Substring(i,1));if (Char.IsDigit(ch)) //判断是否为十进制数buf+=ch;else if (ch != ','){throw new IOException("Malformed PASV strReply: " + strReply);//初始化}if (ch == ',' || i+1 == len){try{parts[partCount++] = Int32.Parse(buf); //转换字符串buf="";}catch (Exception){throw new IOException("Malformed PASV strReply: " + strReply); //初始化新实例}}}string ipAddress = parts[0] + "."+ parts[1]+ "." +parts[2] + "." + parts[3]; //获取ipint port = (parts[4] << 8) + parts[5]; //获取端口号Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), port);try{s.Connect(ep); //建立连接}catch(Exception) //执行发生的错误{throw new IOException("Can't connect to remote server"); //初始化}return s;}/// <summary> //运行时生成相应的文档信息/// 关闭socket连接(用于登录以前)/// </summary>private void CloseSocketConnect() //关闭socket连接{if(socketControl!=null) //判断socket{socketControl.Close();socketControl = null;}bConnected = false; //不登录}/// <summary> //运行时生成相应的文档信息/// 读取Socket返回的所有字符串/// </summary>/// <returns>包含应答码的字符串行</returns>private string ReadLine() //读取Socket返回的所有字符串{while(true){int iBytes = socketControl.Receive(buffer, buffer.Length, 0); //接收数据放入缓冲区strMsg += ASCII.GetString(buffer, 0, iBytes); //解码字符if(iBytes < buffer.Length){break;}}char[] seperator = {'\n'};string[] mess = strMsg.Split(seperator); //返回的应答信息if(strMsg.Length > 2) //判断应答信息字符数{strMsg = mess[mess.Length-2];}else{strMsg = mess[0];}if(!strMsg.Substring(3,1).Equals(" ")) //返回字符串正确的是以应答码{return ReadLine();}return strMsg;}/// <summary> //运行时生成相应的文档信息/// 发送命令并获取应答码和最后一行应答字符串/// </summary>/// <param name="strCommand">命令</param>private void SendCommand(String strCommand){byte[] cmdBytes = Encoding.GetEncoding("gb2312").GetBytes((strCommand + "\r\n").ToCharArray()); socketControl.Send(cmdBytes, cmdBytes.Length, 0); //发送数据ReadReply(); //记录应答信息}#endregion}}四、运行结果图4 运行结果图五、遇到的问题及解决这部分我主要遇到了如下两个问题,其内容与解决方法如下所列:刚开始设计时对FTP的工作原理不清楚。