Java应用程序开发包实现FTP服务器端程序,提供文件传输服务和相应的统计数据。简单的用户界面和统计功能

Java应用程序开发包实现FTP服务器端程序,提供文件传输服务和相应的统计数据。简单的用户界面和统计功能,第1张

用Java实现FTP服务器

2004-03-10 02:09 来源:eNet论坛

简 介

FTP(File Transfer Protocol 文件传输协议)是Internet 上用来传送文件的协议。在Internet上通过FTP 服务器可以进行文件的上传(Upload)或下载(Download)。FTP是实时联机服务,在使用它之前必须是具有该服务的一个用户(用户名和口令),工作时客户端必须先登录到作为服务器一方的计算机上,用户登录后可以进行文件搜索和文件传送等有关操作,如改变当前工作目录、列文件目录、设置传输参数及传送文件等。使用FTP可以传送所有类型的文件,如文本文件、二进制可执行文件、图象文件、声音文件和数据压缩文件等。

加入收藏 设为首页

--------------------------------------------------------------------------------

FTP 命令

FTP 的主要操作都是基于各种命令基础之上的。常用的命令有:

◆ 设置传输模式,它包括ASCⅡ(文本) 和BINARY 二进制模式;

◆ 目录操作,改变或显示远程计算机的当前目录(cd、dir/ls 命令);

◆ 连接操作,open命令用于建立同远程计算机的连接;close命令用于关闭连接;

◆ 发送操作,put命令用于传送文件到远程计算机;mput 命令用于传送多个文件到远程计算机;

◆ 获取操作,get命令用于接收一个文件;mget命令用于接收多个文件。

编程思路

根据FTP 的工作原理,在主函数中建立一个服务器套接字端口,等待客户端请求,一旦客户端请求被接受,服务器程序就建立一个服务器分线程,处理客户端的命令。如果客户端需要和服务器端进行文件的传输,则建立一个新的套接字连接来完成文件的操作。

编程技巧说明

1主函数设计

在主函数中,完成服务器端口的侦听和服务线程的创建。我们利用一个静态字符串变量initDir 来保存服务器线程运行时所在的工作目录。服务器的初始工作目录是由程序运行时用户输入的,缺省为C盘的根目录。

具体的代码如下:

public class ftpServer extends Thread{

private Socket socketClient;

private int counter;

private static String initDir;

public static void main(String[] args){

if(argslength != 0) {

initDir = args[0];

}else{ initDir = "c:";}

int i = 1;

try{

Systemoutprintln("ftp server started!");

//监听21号端口

ServerSocket s = new ServerSocket(21);

for(;;){

//接受客户端请求

Socket incoming = saccept();

//创建服务线程

new ftpServer(incoming,i)start();

i++;

}

}catch(Exception e){}

}

2 线程类的设计

线程类的主要设计都是在run()方法中实现。用run()方法得到客户端的套接字信息,根据套接字得到输入流和输出流,向客户端发送欢迎信息。

3 FTP 命令的处理

(1) 访问控制命令

◆ user name(user) 和 password (pass) 命令处理代码如下:

if(strstartsWith("USER")){

user = strsubstring(4);

user = usertrim();

outprintln("331 Password");}

if(strstartsWith("PASS"))

outprintln("230 User "+user+" logged in");

User 命令和 Password 命令分别用来提交客户端用户输入的用户名和口令。

◆ CWD (CHANGE WORKING DIRECTORY) 命令处理代码如下:

if(strstartsWith("CWD")){

String str1 = strsubstring(3);

dir = dir+"/"+str1trim();

outprintln("250 CWD command succesful");

}

该命令改变工作目录到用户指定的目录。

◆ CDUP (CHANGE TO PARENT DIRECTORY) 命令处理代码如下:

if(strstartsWith("CDUP")){

int n = dirlastIndexOf("/");

dir = dirsubstring(0,n);

outprintln("250 CWD command succesful");

}

该命令改变当前目录为上一层目录。

◆ QUIT命令处理代码如下:

if(strstartsWith("QUIT")) {

outprintln("GOOD BYE");

done = true;

}

该命令退出及关闭与服务器的连接,输出GOOD BYE。

(2) 传输参数命令

◆ Port命令处理代码如下:

if(strstartsWith("PORT")) {

outprintln("200 PORT command successful");

int i = strlength() - 1;

int j = strlastIndexOf(",");

int k = strlastIndexOf(",",j-1);

String str1,str2;

str1="";

str2="";

for(int l=k+1;l

str1 = str2 + strcharAt(l);

}

for(int l=j+1;l<=i;l++){

str2 = str2 + strcharAt(l);

}

tempPort = IntegerparseInt(str1) 16 16 +IntegerparseInt(str2);

}

使用该命令时,客户端必须发送客户端用于接收数据的32位IP 地址和16位 的TCP 端口号。这些信息以8位为一组,使用十进制传输,中间用逗号隔开。

◆ TYPE命令处理代码如下:

if(strstartsWith("TYPE")){

outprintln("200 type set");

}

TYPE 命令用来完成类型设置。

(3) FTP 服务命令

◆ RETR (RETEIEVE) 和 STORE (STORE)命令处理的代码

if(strstartsWith("RETR")){

outprintln("150 Binary data connection");

str = strsubstring(4);

str = strtrim();

RandomAccessFile outFile = new

RandomAccessFile(dir+"/"+str,"r");

Socket tempSocket = new Socket(host,tempPort);

OutputStream outSocket

= tempSocketgetOutputStream();

byte byteBuffer[]= new byte[1024];

int amount;

try{

while((amount = outFileread(byteBuffer)) != -1){

outSocketwrite(byteBuffer, 0, amount);

}

outSocketclose();

outprintln("226 transfer complete");

outFileclose();

tempSocketclose();

}

catch(IOException e){}

}

if(strstartsWith("STOR")){

outprintln("150 Binary data connection");

str = strsubstring(4);

str = strtrim();

RandomAccessFile inFile = new

RandomAccessFile(dir+"/"+str,"rw");

Socket tempSocket = new Socket(host,tempPort);

InputStream inSocket

= tempSocketgetInputStream();

byte byteBuffer[] = new byte[1024];

int amount;

try{

while((amount =inSocketread(byteBuffer) )!= -1){

inFilewrite(byteBuffer, 0, amount);

}

inSocketclose();

outprintln("226 transfer complete");

inFileclose();

tempSocketclose();

}

catch(IOException e){}

}

文件传输命令包括从服务器中获得文件RETR和向服务器中发送文件STOR,这两个命令的处理非常类似。处理RETR命令时,首先得到用户要获得的文件的名称,根据名称创建一个文件输入流,然后和客户端建立临时套接字连接,并得到一个输出流。随后,将文件输入流中的数据读出并借助于套接字输出流发送到客户端,传输完毕以后,关闭流和临时套接字。

STOR 命令的处理也是同样的过程,只是方向正好相反。

◆ DELE (DELETE)命令处理代码如下:

if(strstartsWith("DELE")){

str = strsubstring(4);

str = strtrim();

File file = new File(dir,str);

boolean del = filedelete();

outprintln("250 delete command successful");

}

DELE 命令用于删除服务器上的指定文件。

◆ LIST命令处理代码如下:

if(strstartsWith("LIST")) {

try{

outprintln("150 ASCII data");

Socket tempSocket = new Socket(host,tempPort);

PrintWriter out2= new PrintWriter(tempSocketgetOutputStream(),true);

File file = new File(dir);

String[] dirStructure = new String[10];

dirStructure= filelist();

String strType="";

for(int i=0;i

if( dirStructure[i]indexOf("") == -1) {

strType = "d ";}

else

{strType = "- ";}

out2println(strType+dirStructure[i]);

}

tempSocketclose();

outprintln("226 transfer complete");

}

catch(IOException e){}

LIST 命令用于向客户端返回服务器中工作目录下的目录结构,包括文件和目录的列表。处理这个命令时,先创建一个临时的套接字向客户端发送目录信息。这个套接字的目的端口号缺省为1,然后为当前工作目录创建File 对象,利用该对象的list()方法得到一个包含该目录下所有文件和子目录名称的字符串数组,然后根据名称中是否含有文件名中特有的“”来区别目录和文件。最后,将得到的名称数组通过临时套接字发送到客户端。

以二进制流上传,然后实现断点续传。

/

上传文件到FTP服务器,支持断点续传

@param local 本地文件名称,绝对路径

@param remote 远程文件路径,使用/home/directory1/subdirectory/fileext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构

@return 上传结果

@throws IOException

/

public UploadStatus upload(String local,String remote) throws IOException{

FTPClient ftpClient = new FTPClient();

//设置PassiveMode传输

ftpCliententerLocalPassiveMode();

//设置以二进制流的方式传输

ftpClientsetFileType(FTPBINARY_FILE_TYPE);

UploadStatus result;

//对远程目录的处理

String remoteFileName = remote;

if(remotecontains("/")){

remoteFileName = remotesubstring(remotelastIndexOf("/")+1);

String directory = remotesubstring(0,remotelastIndexOf("/")+1);

if(!directoryequalsIgnoreCase("/")&&!ftpClientchangeWorkingDirectory(directory)){

//如果远程目录不存在,则递归创建远程服务器目录

int start=0;

int end = 0;

if(directorystartsWith("/")){

start = 1;

}else{

start = 0;

}

end = directoryindexOf("/",start);

while(true){

String subDirectory = remotesubstring(start,end);

if(!ftpClientchangeWorkingDirectory(subDirectory)){

if(ftpClientmakeDirectory(subDirectory)){

ftpClientchangeWorkingDirectory(subDirectory);

}else {

Systemoutprintln("创建目录失败");

return UploadStatusCreate_Directory_Fail;

}

}

start = end + 1;

end = directoryindexOf("/",start);

//检查所有目录是否创建完毕

if(end <= start){

break;

}

}

}

}

//检查远程是否存在文件

FTPFile[] files = ftpClientlistFiles(remoteFileName);

if(fileslength == 1){

long remoteSize = files[0]getSize();

File f = new File(local);

long localSize = flength();

if(remoteSize==localSize){

return UploadStatusFile_Exits;

}else if(remoteSize > localSize){

return UploadStatusRemote_Bigger_Local;

}

//尝试移动文件内读取指针,实现断点续传

InputStream is = new FileInputStream(f);

if(isskip(remoteSize)==remoteSize){

ftpClientsetRestartOffset(remoteSize);

if(ftpClientstoreFile(remote, is)){

return UploadStatusUpload_From_Break_Success;

}

}

//如果断点续传没有成功,则删除服务器上文件,重新上传

if(!ftpClientdeleteFile(remoteFileName)){

return UploadStatusDelete_Remote_Faild;

}

is = new FileInputStream(f);

if(ftpClientstoreFile(remote, is)){

result = UploadStatusUpload_New_File_Success;

}else{

result = UploadStatusUpload_New_File_Failed;

}

isclose();

}else {

InputStream is = new FileInputStream(local);

if(ftpClientstoreFile(remoteFileName, is)){

result = UploadStatusUpload_New_File_Success;

}else{

result = UploadStatusUpload_New_File_Failed;

}

isclose();

}

return result;

}

程序员10款必备工具抓紧掌握

01·Vim文本编辑器

优点:功能强大、高度可定制,Vi编辑器中最好的一个。

Vim是vi发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。

02·uTools桌面插件工具

优点:简洁美观、插件化,能够节约时间。uTools 是一个极简、插件化的现代桌面软件,通过自由选配丰富的插件,打造得心应手的工具集合。

03·Git分布式版本控制系统

优点:分布式开发、速度快、灵活。Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是LinusTorvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。

04·Navicat数据库管理工具

优点:高效、安全,是最好用的数据库管理工具。“Navicat”是一套可创建多个连接的数据库管理工具,用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和 MongoDB 等不同类型的数据库,它与阿里云、腾讯云、华为云、Amazon RDS、Amazon Aurora、AmazonRedshift、Microsoft Azure、Oracle Cloud 和MongoDB Atlas等云数据库兼容

05·IntelliJ IDEA集成开发环境

优点:业界排名第一的java开发工具。IintelliJIDEA,是java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、创新的GUI设计等方面的功能可以说是超常的。

06·iTerm2终端管理器

优点:功能强大,一款终端神器。Term2 Mac版可以说是Mac下最好的终端工具。iTerm2拥有多标签、中键复制粘贴、命令记忆、高亮指针、迅捷重复、全屏切换等功能,提升操作效率。

07·Alfred查询和搜索工具

优点:被称作效率神器。

Alfred是 Mac系统上一款专注于效率提升的著名应用,它能帮你快速打开网页、快速进行自定义搜索查看剪贴板历史、快速查询单词等等。Alfred 提供的功能虽然很多,但目的只有一个 - 那就是减少我们工作中的一些重复动作,提升我们的工作效率。

08·Beyond Compare代码比较工具

优点:高效,适用于用于文档、源代码和HTMLoBeyond Compare可以很方便地对比出两份源代码文件之间的不同之处,相差的每一个字节用颜色加以表示,查看方便,支持多种规则对比。

09·Docker开源的应用容器引擎

优点:跨平台,跨服务器,实现应用程序跨平台间的无缝衔接。

Docker 其中包括,镜像、容器、仓库,很简单,目的就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的产品(可以是 web 应用或者数据库应用)及其环境能够做到“一次封装,到处运行”。

10·Postman接口调试与测试工具

优点:功能强大,使用简单且易用性好。Postman是一个简单好用的网页调试软件,很适合开发人员使用,性能稳定流畅,提供接口测试、并发测试等功能,还支持编写测试脚本,快速处理各种HTTP请求,测试数据精准高效。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » Java应用程序开发包实现FTP服务器端程序,提供文件传输服务和相应的统计数据。简单的用户界面和统计功能

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情