FTP客户端软件的设计与实现

更新时间:2024-05-04 21:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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 client

Abstract

The 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在全世界的普及和发展,越来越多的用户将自己的计算机连入这个人类有史以来最庞大的网络中。其中FTP(File Transfer Protocol)是Internet中最早提供的服务之一,目前仍在被人们广泛使用着。如果说Internet是如今的信息高速公路的话,FTP文件传输系统就是其上面的洲际车,它使用TCP/IP体系结构中应用层上的FTP协议在不同的计算机系统之间互相传输文件。人们通常将文件传输服务称为FTP服务。通过FTP服务,Internet上的用户可以从授权的异地计算机上获取所需的文件,也可以把本地文件传输到其他计算机上,这就为计算机之间双向传输文件提供了一种有效的手段。FTP凭借其透明、快捷等特点,越来越多的人通过FTP能够在互联网上获得大量免费文件,FTP协议已经是Internet上应用最多的协议之一。

虽然FTP应用非常广泛,但在国内仍然缺乏高性能的产品。由于商业原因,对国外FTP文件传输系统中的关键技术也知之甚少;同时国内对FTP系统的研究也是相对较少的,这从学术刊物上发表的相关文章就可以看出。所以基于FTP的文件传输系统的研究是有一定意义的。在FTP的众多功能中,安全性是一个突出且敏感的功能。绝大多数企业、部门在使用FTP的时候,都会考虑这个问题,把它作为选购FTP文件传输系统产品的重要依据。目前市场上流行的FTP系统,像CuteFtp、FtpCommander、FlashFtp等,都是国外的产品,虽然功能和性能等方面都还不错,但毕竟是通用的软件,任何人都可以得到并对其进行研究,从而可能给这些软件的安全性带来潜在的问题。从保证安全性的角度出发,很有必要根据自身的需要开发一个自己的文件传输系统,这样就可以避免采用通用软件带来的危险。另一方面,在实际使用国外产品的过程中,发现它们并不能很好的满足用户的要求。比如说,访问日志功能,虽然绝大多数的国外产品都有,但是,这些日志功能都是固定的,不能够根据用户的要求来灵活的生成,而这个功能又是用户所必须的。因此研究并实现FTP文件传输系统不仅有助于深入了解各种Innternet协议的实现细节,掌握FTP的技术,而且可实现软件的国产化,满足国内用户的安全性需求,对于社会和个人都有积极的意义。

本毕业设计将介绍FTP客户端系统的设计和开发工作,因此,文章将涵盖以下四个方面的内容:1.基础技术知识介绍; 2.文件传输系统的详细需求;3.介绍系统体的具实现;4.对最终系统进行测试。通过这次课题,对整个开发过程有深入的了解,提高实践能力。FTP将在未来的很长时间里作为主要的文件传输协议,使用前景仍然宽广,功能会更加强大。

1.2 课题现状

互联网上传统的技术模式是C/S模式,FTP(File Transfer Protocol)文件传输服务就是这种模式的典型代表。FTP是TCP/IP协议组中的协议之一,该协议是Internet文件传送的基础,它促进了文件的共享、鼓励间接或者隐式地使用远程计算机、向用户屏蔽不同主机中各种文件存储系统的细节以及提供可靠和高效的数据传输。在TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。FTP中主要采用了TCP传输控制协议(Transmission Control Protocol)和Telnet协议。

在网络普及的今天,政府机关、企业、学校等各行各业已经广泛地应用并建立了自己的FTP文件传输系统,FTP极大地提高了我们的工作效率和管理水平。由于计算机网络的互联、互通的特性,为我们工作带来方便和效率。普通的FTP服务要求用户必须在要访问的计算机上有用户名和口令。而Internet上最受欢迎的是称为匿名FTP的服务,用户在登录这些服务器时不用事先注册一个用户名和口令,而是以“anonymous”或“FTP”为用户名,自己的电子邮件地址为口令即可。匿名FTP是目前Internet上进行资源共享的主要途径之一。它的特点是访问方便,操作简单,容易管理。Internet上有许多的资源都是以FTP的形势提供给大家使用的,包括各种文档、软件工具包等等。

FTP虽然是一种已经成熟且应用广泛的的技术,但是其仍然存在需要改进的地方。主要有下面几个方面:

(1) 服务器和客户端的功能被明确划分,如何在服务器端负载压力很大的情况下提高客户端的带宽资源的利用率。

(2) FTP使用明文传输,如何使用多种加密手段保全系统及客户信息的安全。 (3) FTP时延太高,如何保证文件传输速度的稳定。 (4) FTP的开放性,如何保证共享资源的内容健康。

1.3 本文组织方式

本文从课题的的现状和背景入手,分析了FTP文件传输系统的现状和国内外的研究背景。后续章节的主要内容安排如下:第二章开发工具及关键技术,主要讲述了本次设计用到的编程语言java和开发平台Jbuilder 2006,并对它们的特点进行了说明;接着阐述了本次设计用到的关键技术C/S模式与socket网络编程,最后对FTP协议进行了介绍。第三章文件传输系统设计主要讲述了FTP文件传输系统的设计,对系统进行需求分析,各个模块的流程划分、设计和架构,并对用到的关键技术进行了说明。第四章文件传输系统的实现,对客户端和服务器各个功能模块的编码实现进行说明并列出部分代码。第五章系统测试,对客户端和服务器进行了测试,测试结果表明系统实现了设计的功能并达到预期的性能。

第2章 开发工具及关键技术

2.1 开发工具

2.1.1 开发语言

Java是Sun公司推出的一种编程语言。Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型,高度抽象,采用纯面向对象编程的思想和方法。Java还带有很多的扩展的类包(Package),在程序中可以轻松调用,简化程序员的工作。Java程序运行的硬件或软件环境,称为平台。Java平台包括2个部分:Java虚拟机和Java应用程序接口。Java API:Java应用程序接口,用于Java程序的使用和Java虚拟机的接口。Java虚拟机用于将Java字节码翻译成特定机器码。基于硬件的平台,即Java程序运行的特定的硬件环境。

Java是一种简单的、面象对象的、分布式的、解释的、键壮的、安全的、结构的、中立的、可移植的、性能很优异的、多线程的、动态的语言。Java特点有如下: 1、平台无关性

平台无关性是指Java能运行于不同的平台。Java引进虚拟机原理,并运行于虚拟机,实现不同平台的Java接口之间。使用Java编写的程序能在世界范围内共享。Java的数据类型与机器无关,Java虚拟机(Java Virtual Machine)是建立

在 硬件和操作系统之上,实现Java二进制代码的解释执行功能,提供于不同平台的接口的。 2、安全性

Java的编程类似C++,学习过C++的读者将很快掌握Java的髓。Java舍弃了C++的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针侵入系统。Java对程序提供了安全管理器,防止程序的非法访问。 3、面向对象

Java吸取了C++面向对象的概念,将数据封装于类中,利用类的优点实现了程序的简洁性和便于维护性。类的封装性、继承性等有关对象的特性,使程序代码只需一次编译,然后通过上述特性反复利用。程序员只需把主要精力用在类和接口的设计和应用上。Java提供了众多的一般对象的类,通过继承即可使父类的方法。在Java中,类的继承关系是单一的而非多重的,一个子类只有一个父类,子类的父类又有一个父类。Java提供的Object类及其子类的继承关系如同一棵倒立的树形,根类为Object类,Object类功能强大,经常会使用到它及其它派生的子类。 4、分布式

Java建立在扩展TCP/IP网络平台上。库函数提供了用HTTP和FTP协议传送和接受信息的方法。这使得程序员使用网络上的文件和使用本机文件一样容易。 5、键壮性

Java致力于检查程序在编译和运行时的错误,类型检查帮助检查出许多开发早期出现的错误。Java可以自己操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能。这些功能特征大大提高了开发Java应用程序的周期。

2.1.2 开发平台

NetBeans包括开源的开发环境和应用平台,NetBeans IDE可以使开发人员利用Java平台能够快速创建Web、企业、桌面以及移动的应用程序,NetBeans IDE已经支持PHP、Ruby、JavaScript、Groovy、Grails和C/C++等开发语言。

NetBeans项目由一个活跃的开发社区提供支持, NetBean开发环境提供了丰富的产品文档和培训资源以及大量的第三方插件。

NetBeans是开源软件开发集成环境,是一个开放框架,可扩展的开发平台,可以用于Java、C/C++,PHP等语言的开发,本身是一个开发平台,可以通过扩展插件来扩展功能。

在 NetBeans Platform 平台中,应用软体是用一系列的软体模组(Modular Software Components)建构出来。而这些模组是一个jar档(Java Archive File)它包含了一组Java程式的类别而它们实作全依据依 NetBeans 定义了的公开介面以及一系列用来区分不同模组的定义描述档(Manifest File)。有赖於模组化带来的好处,用模组来建构的应用程式可只要加上新的模组就能进一步扩充。由於模组可以独立地进行开发,所以由 NetBeans 平台开发出来的应用程式就能利用着第三方软件,非常容易及有效率地进行扩充。如果用户既要求易于进行可视化布局,又要求有较大的灵活性,NetBeans就是最好的选择。

2.2 关键技术

2.2.1 C/S架构简介

客户机/服务器在分布处理过程中,使用基于连接的网络通信模式。该通信模式首先在客户机和服务器之间定义一套通信协议,并创建一Socket类,利用这个类建立一条可靠的链接;然后,客户机/服务器再在这条链接上可靠地传输数据。客户机发出请求,服务器监听来自客户机的请求,并为客户机提供响应服务。这就是典型的“请求--应答”模式。下面是客户机/服务器的一个典型运作过程:

(1)服务器监听相应端口的输入; (2)客户机发出一个请求; (3)服务器接收到此请求;

(4)服务器处理这个请求,并把结果返回给客户机; (5)上述过程,直至完成一次会话过程。

图1 2层C/S结构图

2.2.2 SOCKET网络编程

所谓socket通常也称作\套接字\,应用程序通常通过\套接字\向网络发出请求或者应答网络请求。socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信,取后一种意思。用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

使用socket套接字,利用TCP/IP或者UDP协议,实现几个机器之间的通信。一般使用C/S结构。以TCP/IP为例:首先建立一个服务器,步骤如下:socket()创建一个socket,bind()绑定socket得到一个端口,listen()监听端口,accept()等待客户端的连接。客户端程序:socket()创建一个socket,可以绑定也可以不绑定,然后connect()连接到服务器端。Socket又分为阻塞式的和非阻塞式的。阻塞式的就是服务器端等待连接直到连接上,不然一直挂起。

2.2.3 FTP协议简介

FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写。该协议是Internet文件传送的基础,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件。若将文件从自己计算机中拷贝至远程计算机上,则称之为“上载(upload)”文件。在TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。

从根本上说,FTP协议就是在网络中各种不同的计算机之间按照TCP/IP协议来传输文件。FTP协议采用客户机/服务器 (Client/Sever)模式,由FTP客户端程序和FTP服务器端程序组成。使用时,先启动FTP客户端程序与远程主机建

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

FTP客户端设计的原理,FTP使用两条TCP连接来完成文件传输:控制连接与数据连接。控制连接用于传输控制,数据连接用于数据输送。在服务器启动后,服务器就会在端口21等待客户的连接请求,有用户需要传输文件时,客户与服务器的端口21建立一个控制连接,用来传送客户的命令和服务器的应答,该连接一直保持到客户与服务器通信结束为当客户发出数据传输命令时,服务器会主动与客户建立数据连接,并与其进行数据交换。

客户端用户并不直接处理控制连接上的FTP命令和FTP响应,而是由两个协议解释器进行处理。用户接口为客户端用户提供一定形式的输入界面,接收用户的命令,将其转换成标准的FTP命令,最终将控制连接上的FTP响应转换成用户可理解的方式。在客户与服务器的整个连接期间,控制连接必须保持,而数据连接却可以根据请求动态地建立和关闭。在最常用的流模式中,文件结束是用数据连接的关闭来表示的,换句话说,每传输一个文件或文件列表,系统就会再建立一个新的数据连接。

图2 FTP使用的两个TCP连接

第3章 客户端文件传输系统设计

3.1客户端需求分析

3.1.1 用户需求

软件要简单易上手,能够登录到用户指定的服务器上,进行访问和数据的上传下载与重命名,删除等功能。

3.1.2 功能需求

该系统主要包括以下几个方面:

1.可视化的交互界面模块;2.登录服务器模块;3.浏览服务器/本地目录和文件模块;4.上传/下载文件模块。由这四个模块构成该系统。

3.1.3 性能需求

整个系统操作应当简便,界面友好,运行稳定,执行速度快。系统本身运行对计算机硬件平台和操作系统平台要求适中。

3.2客户端设计

3.2.1 客户端整体模块

这个部分是本文设计的中心部分,是对客户端进行主要的功能设计和界面设计。

FTP 客户端作为用户连接FTP 服务器的工具,需要具备一些基本功能模块,如连接、上传、 下载等,其中最主要的三大功能模块如下:

1、下载功能模块:连接用户指定的FTP 服务器,获取服务器目录下的文件列表,当用户选择项目为文件时,点击下载可以下载用户所需要的文件。选定文件后提示用户将文件存储在何处,用户选择存储区后开始下载任务。

依靠FTP 协议的支持,用户下载的文件没有类型和大小限制,即用户可已选择任何自己想要下载的文件,通过FTP 客户端进行下载。 2、上传功能模块:用户可以自行选择本机上存储的文件,上传至FTP 服务器。 在用户选择存储在服务器的位置后,点击上传,选择所需要上传的文件,即可将文件上传至服务器。

3、 连接功能模块:将用户本机与指定的IP 地址连接,验证用户命和密码,在FTP 服务器上进行注册。

有了这三个基本的功能模块,客户端的基本应用功能即可实现。

如图3.1所示:

系统主模块 登录模块 服务器目录浏览 目录文件/文件夹操作模块 服务器目录更新模块 上传下载文件模块 合法帐户 匿名帐户 新建文件夹 删除文件 文件重命名 上传文件 下载文件 图3 FTP客户端整体结构模块图

客户在启动客户端程序后输入相应的登陆信息就能连接到服务器上,对服务器上的文件进行浏览、新建、删除、重命名、上传、下载文件等操作,通过断开结束与服务器的连接。

3.2.2 客户端流程划分

客户端整体流程如图4所示:

bconnect.setText(\连接\ bconnect.addActionListener(new mainView_bconnect_actionAdapter(this)); bdisconnect.setText(\断开连接\ bdisconnect.addActionListener(new mainView_bdisconnect_actionAdapter(this)); lPane.setBackground(Color.gray); lPane.setLayout(borderLayout1); sPane.setBackground(Color.gray); sPane.setLayout(borderLayout2); bDownload.setText(\下载\ bDownload.addActionListener(new mainView_bDownload_actionAdapter(this)); remoteList.addMouseListener(new mainView_remoteList_mouseAdapter(this));

contentPane.add(jPanel1, new XYConstraints(5, 8, 265, 349)); jPanel1.add(jLabel1, new XYConstraints(7, 27, 43, 17)); jPanel1.add(server, new XYConstraints(69, 13, 170, 30)); jPanel1.add(jLabel2, new XYConstraints(7, 69, 46, 18)); jPanel1.add(jLabel3, new XYConstraints(7, 109, 49, 21)); jPanel1.add(jLabel4, new XYConstraints(7, 149, -1, 18)); jPanel1.add(port, new XYConstraints(69, 58, 170, 30)); jPanel1.add(user, new XYConstraints(69, 104, 170, 30)); jPanel1.add(pw, new XYConstraints(69, 148, 170, 30)); jPanel1.add(bdisconnect, new XYConstraints(142, 267, -1, -1)); jPanel1.add(bconnect, new XYConstraints(24, 267, 83, -1)); sPane.add(jScrollPane2, java.awt.BorderLayout.CENTER); jScrollPane2.getViewport().add(statusList);

contentPane.add(bDownload, new XYConstraints(24, 398, 212, 78)); contentPane.add(lPane, new XYConstraints(290, 53, 467, 203)); lPane.add(jScrollPane1, java.awt.BorderLayout.CENTER); contentPane.add(sPane, new XYConstraints(290, 327, 467, 198)); contentPane.add(jLabel6, new XYConstraints(287, 301, 118, 27)); contentPane.add(jLabel5, new XYConstraints(291, 23, 133, 28));

jScrollPane1.getViewport().add(remoteList);

remoteList.setModel(new javax.swing.AbstractListModel() {

String[] strings = { \ 欢迎使用 tFTPClient!\用法:\在左边输入相应信息后按 【连接】按钮,连接FTP服务器\

public int getSize() { return strings.length; }

public Object getElementAt(int i) { return strings[i]; } });

}

登录验证服务器代码:

private void connectHandler(java.awt.event.ActionEvent evt) { String anonymous = \ String anpassword = \ String dMessage = null;

String dTitle = \

int dType = JOptionPane.ERROR_MESSAGE;

if(evt.getSource() == bconnect){

if(server.getText().length() == 0){

dMessage = \请输入FTP服务器的Host/IP地址\

JOptionPane.showMessageDialog( null,dMessage,dTitle,dType);

return; }

if(user.getText().length() == 0 && !jCheckBox2.isSelected()){ dMessage = \请输入用户帐号\

JOptionPane.showMessageDialog( null,dMessage,dTitle,dType);

return;

}

datsktsvr = new ServerSocket(0);// 获得一个随机端口 port = datsktsvr.getLocalPort(); // 设置 host&port

StringBuilder cmd = new StringBuilder(\

cmd.append(ctlskt.getLocalAddress().getHostAddress()); //返回InetAddress 对象的“X.Y.W.Z”形式的IP地址

for (int i = 0; i < cmd.length(); i++) {

// 把 202.168.255.255 形式 转换成 202,168,255,255 形式

if ('.' == cmd.charAt(i)) cmd.setCharAt(i, ','); }

// port = secondlast*256 + last cmd.append(\

cmd.append(Integer.toString(port / 256)); cmd.append(\

cmd.append(Integer.toString(port & 0xFF)); status = sendCmd(cmd.toString()); if (status != 200) // 200 命令正确 return -1;

status = sendCmd(datCmd); // 等待远程服务器的连接 datskt = datsktsvr.accept(); }

return 0;

界面与登录图:

图5 登录实现界面图

4.3 浏览程序

我们利用FtpClient控件可以实现FTP客户端应用程序的浏览功能,浏览功能的实现程序由浏览服务器端文件和浏览本地文件两部分组成。

4.3.1浏览服务器端目录程序

当连接登录成功之后,可使用FtpClient控件的List()方法执行FTP服务器端上的目录浏览(List)功能,以取得FTP服务器默认的目录内容。一般List方法会列出FTP端目录与文件的详细内容,包括创建文件日期,文件大小,目录与文件的名称等相关信息。当然,FTP服务器端必须开放目录读取的权限,以允许连接登录及浏览目录,否则,Connect方法会执行失败。而这个方法执行后的结果是TelnetInputStream数据流,本系统要把它显示在一个列表框中,还需要进行分解操作。下面是对列表框进行操作的程序代码: */

protected FileInfo readFileInfo(String fileInfo,int system){ String[] temp = fileInfo.split(\

boolean isDir = false;

if(system == FileInfo.UNIX){

//-rwxrw-r-- 1 user group 3014 Nov 12 14:57 cwinvnc337.ESn // 0 1 2 3 4 5 6 7 8

String[] parts = new String[9]; int j = 0;

for(int i =0; i8) break;

parts[j] = temp[i]; j++; } }

if(j==9){

parts[8] = getFileName(fileInfo,52);//if the file name contains space }

//check is a dir or a file

isDir = (parts[0].charAt(0)=='d'); return new

FileInfo(FileInfo.UNIX,parts[0],parts[1],parts[2],parts[3],parts[4],parts[5]+\ }else if(system == FileInfo.DOS){

//02-23-05 09:24AM 2245 readme.ESn

// 0 1 2 3 String[] parts = new String[4]; int j = 0;

for(int i =0; i3) break;

parts[j] = temp[i]; j++; } }

if(j>3)

parts[3] = getFileName(fileInfo, 20);//unknow system //check is a dir or a file

isDir = (parts[2].equals(\ return new

FileInfo(FileInfo.DOS,parts[0],parts[1],parts[2],parts[3],isDir);

}else{

System.out.println(\ return null; }

}

//文件目录的主要操作功能代码

private void jbInit() throws Exception {

popMenu = new JPopupMenu();

jLabel5.setText(\服务器文件/目录列表:\ jLabel6.setText(\状态信息:\

popMenu.add(item = new JMenuItem(\刷新目录\ item.addActionListener(popMenuListener);

popMenu.add(item =new JMenuItem(\上载文件\ item.addActionListener(popMenuListener);

popMenu.add(item =new JMenuItem(\下载文件\ item.addActionListener(popMenuListener);

popMenu.add(item =new JMenuItem(\新建文件夹\ item.addActionListener(popMenuListener); popMenu.add(item =new JMenuItem(\删除\ item.addActionListener(popMenuListener); popMenu.add(item =new JMenuItem(\重命名\ item.addActionListener(popMenuListener);

图 6 目录图

4.4 文件的上传与下载

通过浏览程序对FTP服务器和本地文件系统的浏览,解决了客户端和服务器端的文件和目录选择的问题,但是文件数据是需要传送和交换的,下面我们将介绍如何实现文件的下载和上传等操作过程。

4.4.1文件下载程序

当我们想下载文件,可以使用TelnetInputStream流,并使用FTPClient控件的get方法将流的源头绑定,再将TelnetInputStream流绑定到DataInputStream流中,然后再在本地新建一个文件,并绑定到RandomAccessFile流中,执行DataInputStream流的读并写入RandomAccessFile流中,就可以完成下载功能了。

当然,程序首先需要判断本地浏览框中选中的是目录还是文件,或者根本就没有在本地浏览框中选择。为了可同时选择多个文件下载,必须先设置list1控件的MultipleMode属性为true,以便能够在远程浏览框中进行多重选择。

接着在程序中利用list1控件对象的getSelectedItems方法获取所选择的文件和目录,并判断是否为目录;若是目录,则在本地创建一个目录(本实例没有使用递归的方法,所以不能下载目录中的文件和子目录),否则,将进行文件下载。一直重复至所有被选择文件或者目录都被完成操作为止。在这里,使用了一个isfile的boolean变量用于判断是否为文件。

4.4.2文件上传程序

上传文件基本上与下载文件类似,不过使用的是OutputStream流,并使用FTPClient控件的put方法和流绑定,再将OutputStream流绑定到DataOutputStream流中,然后在本地新建一个文件,并绑定到RandomAccessFile流中,执行RandomAccessFile流的读并写入DataOutputStream流中,就可以完成上传功能了。代码如下:

public int dataSocketIn(String datCmd, RandomAccessFile f) throws IOException{

int status;

status = dataSocket(datCmd); if(status!=0) return status;

//datReader = new InputStreamReader(datskt.getInputStream()); InputStream inStream = datskt.getInputStream();

// 传输数据直到数据关闭 byte[] byteBuffer = new byte[1024]; int amount; int debugCount = 0; do{

amount = inStream.read(byteBuffer); debugCount+=amount;

//System.out.println(\ if(amount!=-1) f.write(byteBuffer,0,amount); }while(amount!=-1);

System.out.println(\ inStream.close(); datskt.close(); return getResponse();

}

case \下载文件\ {

//download files

if(remoteList.isSelectionEmpty()) return; if(fc == null)

fc = new JFileChooser();

fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY );

int option = fc.showSaveDialog(bDownload); String saveFilePath;

if(option == JFileChooser.APPROVE_OPTION){ //user pressed SAVE button

saveFilePath = fc.getSelectedFile().toString(); }else{

//cancelled return;

} Object[] fileList = (Object []) remoteList.getSelectedValues();

for (Object fileList1 : fileList) {

String fileInfo = fileList1.toString(); String name =

ftpDrive.getFileName(fileInfo,FileInfo.nameStartAt);

if(fileInfo.charAt(0)=='d')

ftpDrive.downloadFold(name, saveFilePath); if(fileInfo.charAt(0)=='-')

ftpDrive.downloadFile(name,saveFilePath+\

if(fileInfo.charAt(0)=='g') { } }

statusList.append(\ break; }

case \上载文件\ {

//upload files if(fc==null)

fc = new JFileChooser();

fc.setFileSelectionMode(JFileChooser.FILES_ONLY);

String files;

int option=fc.showSaveDialog(bDownload);

if(option == JFileChooser.APPROVE_OPTION){ //user pressed SAVE button

files = fc.getSelectedFile().toString(); }else{

//cancelled return;

} File targetFile = new File(files); ftpDrive.uploadFile(targetFile); updateList();

statusList.append(\ break; }

实现从另一台电脑上下载文件到自己的电脑上:

图7 文件上传前

上传成功后,文件在服务器目录列表中成功显示:

图8 文件上传后

然后是下载文件功能的测试,进入到music文件夹下,选择张学友-慢慢mp3 文件,点击下载选择保存至桌面,如图9:

图9 下载文件

下载完成后,消息记录里显示下载完成:

图10 文件下载完成图

文件的删除代码与实现:

case \删除\

{

//delete the select item

if(remoteList.isSelectionEmpty()) return; int result =

JOptionPane.showConfirmDialog(remoteList,\it(them)?\

if(result!=JOptionPane.YES_OPTION) return; //begin to delete

Object[] fileList = (Object []) remoteList.getSelectedValues();

for (Object fileList1 : fileList) {

String fileInfo = fileList1.toString();

String name = ftpDrive.getFileName(fileInfo,FileInfo.nameStartAt); if(fileInfo.charAt(0)=='d')

ftpDrive.deleteFold(name); if(fileInfo.charAt(0)=='-')

ftpDrive.deleteFile(name); else { } } updateList();

statusList.append(\ break; }

然后是删除功能的实现,选择将要删除wangpeng毕业论文1.pdf这个文件,如图所示:

图11 文件删除前

删除完成后从列表中消失,如图所示:

图12 文件删除后

文件重命名代码:

case \重命名\

{

//rename a file or a fold

if(remoteList.isSelectionEmpty()) return;

Object[] fileList = (Object []) remoteList.getSelectedValues();

if(fileList.length!=1) return;

//open rename dialog String oldName =

ftpDrive.getFileName(fileList[0].toString(),FileInfo.nameStartAt);

String newName =

JOptionPane.showInputDialog(remoteList,\dialog\

if(newName==null||newName.equals(\ return;

System.out.println(\oldName:\

ftpDrive.rename(oldName,newName); //update list updateList();

statusList.append(\ break; } default:

System.out.println(\ break; }

对文件进行重命名

图13 重命名图

新建文件夹代码与实现:

case \新建文件夹\

// create a new fold String newFoldName =

JOptionPane.showInputDialog(remoteList,\dialog\

if(newFoldName==null||newFoldName.equals(\ return;

System.out.println(\ ftpDrive.createFold(newFoldName); //update list updateList();

statusList.append(\ break;

图14 新建文件夹图

刷新目录代码与实现:

case \刷新目录\

//renew the remote list updateList();

statusList.append(\ break;

图15 刷新目录图

第5章 系统测试及问题处理

5.1测试环境

系统测试机器:

CPU: AMD Athlon 2500+ MAINBOARD: Epox 8RDA3+ MEMORY: Kingston DDR 768M HARDDISK: WESTDIGITAL 120JB

程序测试环境:

Windows 2007 NetBeans JRE 1.4

5.2 测试结果

在本地系统安装FTP服务器端软件Serv-U,用于提供FTP服务,IP地址127.0.0.1,端口号使用默认端口21。创建FTP登录帐号,分配适当的权限。(Serv-U的安装和配置过程略过,可见该软件帮助文件。)

5.2.1登录模块测试

主要是利用FtpClient控件实现FTP客户端应用程序的登录功能。要登录FTP服务器,输入合法的用户帐号和密码,如是匿名登录用户帐号为Anonymous,密码一般为空。

详细设置参数:

hostname:服务器的IP地址或主机名称,为字符串类型; port: 服务器的通信端口,为int类型(FTP端口默认为21); username:用户的登录账号; password:用户的登录密码;

这次毕业设计遇到的难点就是:连接到FTP服务器上,可以浏览它的内容,但不能识别文件夹。此问题后来通过使用搜索、BBS上发贴请教,最后算是顺利解决如何判断文件和目录。

5.2.2系统兼容性测试

经测试,该系统在WINDOWS 2007以及WINDOWS XP下均能正常工作。

5.3 测试总结

系统在上述软硬件环境下作出测试,结果基本能够达到预期功能,满足用户的基本的登录服务器,上传下载数据的需求。并且系统在Windows平台上经测试能够稳定的运行。

其中应注意几点,如:1.测试时最好将防火墙关闭或者降低安全级别; 2.登录帐号一定要是合法注册的,并在服务器端设置好正确的用户权限。否则就可能无法正常连接到服务器,上传下载数据。

不足之处在于上传下载过程中无法得知过程进度、剩余时间等信息,对用户上传较大文件时会造成一定的不方便。能加入断点传输的话更佳,由于ftpclient不自带断点传送功能,如今后该系统增加此功能会比较困难。

总的来说,测试内容较少,可能会存在一些BUG,与现实生活中大家使用的那些FTP下载软件有相当的距离。对此,还更应该的深入的学习Java语言中的那多重要的类库,更全面的了解他们的功能,争取完善其功能。

结 论

在李晓宇老师的指导和督促下,经过紧张的设计与开发,我的毕业设计课题-FTP客户端软件的设计与开发终于开发完成了,虽然该系统功能上还有许多不足,但通过这几个月的钻研,从拟定方案,设计模块,解决开发过程中遇到的各种困难,最终实现了该文件传输系统的基本功能。此系统操作界面简洁易懂,普通用户也能很快上手;此系统实现了远程登录服务器、浏览本地与服务器目录文件和数据上传下载等功能需求,从而实现了一个简易的FTP客户端软件。通过自己实际设计并开发一个FTP客户端软件,使我了解了C/S开发模式和FTP的发展历史及工作原理,对FTP协议在网络中的结构和本身协议在传输的作用有了更深的认识。通过系统测试,我又了解了软件测试的理论知识,理解了测试的概念,了解了测试方法以及过程,虽然只是很有限的尝试和使用,但我尽量通过所学的知识从中寻找错误和不足,也对我今后做类似项目起到了积极的指导作用,总的说来此次课题我受益颇丰。

参考文献

[1] Herbert Schildt.Java实用教程[M].北京:清华大学出版社,2005。 [2] 胡月,叶曙光,徐饪.Jbuilder9入门与提高[M].北京:科学出版社,2004。 [3] 耿祥义,张跃平.JAVA2实用教程(第二版)[M].北京:清华大学出版社,2004。 [4] 杨树林,胡洁萍.JAVA语言最新实用案例教程[M].北京:科学出版社,2006。 [5] W.Richard Stevens.TCP/IP详解 卷1:协议[M].北京:机械工业出版社,2000。 [6] 谢希仁.计算机网络(第四版)[M].北京:电子工业出版社,2005。

致 谢

本文是在XXX老师的热情关心和指导下完成的,他渊博的知识和严谨的治学作风使我受益匪浅,对顺利完成本课题起到了极大的作用。在整个毕业设计过程中,指导老师从开始布置课题起,就为我讲解这次课题的基本要求和实现的功能,还推荐给我参考书学习,鼓励我,使我明确了方向,给了我信心。在此向他们表示我最衷心的感谢!

在论文完成过程中,本人还得到了系上许多老师和众位同学的热心帮助,本人向他们表示深深的谢意!

最后向在百忙之中评审本文的各位专家、老师表示衷心的感谢!

作者简介:

姓 名: XX 性 别: 男 民 族: 汉 E-mail:

声 明

本论文的工作是 2014年02月至2014年06月在XX大学信息工程学院完成的。文中除了特别加以标注地方外,不包含他人已经发表或撰写过的研究成果,也不包含为获得XX大学或其他教学机构的学位或证书而使用过的材料。除非另有说明,本文的工作是原始性工作。

关于学位论文使用权和研究成果知识产权的说明

本人完全了解XX大学有关保管使用学位论文的规定,其中包括: (1)学校有权保管并向有关部门递交学位论文的原件与复印件。 (2)学校可以采用影印、缩印或其他复制方式保存学位论文。 (3)学校可以学术交流为目的复制、赠送和交换学位论文。 (4)学校可允许学位论文被查阅或借阅。

(5)学校可以公布学位论文的全部或部分内容(保密学位论文在解密后遵守此规定)。

除非另有科研合同和其他法律文书的制约,本论文的科研成果属于成都信息工程学院。 特此声明!

作者签名: XX

2014 年 5月 9 日

本文来源:https://www.bwwdw.com/article/jddg.html

Top