FTP相关知识:
FTP也就是文件传输协议,FTP协议是目前因特网用得最广泛的文件传输协议。通过该协议可以实现两台相距较远的计算机实现上传文件和下载文件。FTP采用的是C/S方式。用户通过一个支持FTP协议的客户端程序连接到远程主机的FTP服务器上,用户通过客户端发送命令给FTP服务器,FTP执行该命令,然后将执行结果返回给客户端。
FTP客户端功能分析:
1) 能完成FTP链接的打开和关闭操作;
2)能执行文件的上传和下载;
3)能完成目录的创建、删除等有关操作。
FTP服务器我是采用FileZilla Server,具体实现是采用java的org.apache.commons.net.ftp.FTPClient这个类,该类具体的可查看官网的api文档,链接:FTPClient API。要运用该类之前还要导入相应的jar包,我下载的是commons-net-3.6.jar,下载链接:http://commons.apache.org/proper/commons-net/download_net.cgi。
以下是我实现的代码,写得不好还请多多指教
package ftp;
import org.apache.commons.net.ftp.FTPClient;
/*该类封装了访问FTP服务器所需的基本参数*/
public class FtpBean {
private String url = null; // FTP服务器的IP地址
private String username = null; // FTP服务器的用户名
private String password = null; // 登录FTP服务器的密码
private int port = -1; // FTP服务器监听的端口
private String localFile = null; // 本地文件路径
private String remoteFile = null; // 远程文件路径
private String directory = null; // 要创建的FTP服务器上的目录
private FTPClient ftp = null; // 一次连接的FTPClient对象
public FtpBean() {
}
public void setUrl(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public void setPort(int port) {
this.port = port;
}
public int getPort() {
return port;
}
public void setLocalFile(String localFile) {
this.localFile = localFile;
}
public String getLocalFile() {
return localFile;
}
public void setRemoteFile(String remoteFile) {
this.remoteFile = remoteFile;
}
public String getRemoteFile() {
return remoteFile;
}
public void setDirectory(String directory) {
this.directory = directory;
}
public String getDirectory() {
return directory;
}
public void setFtp(FTPClient ftp) {
this.ftp = ftp;
}
public FTPClient getFtp() {
return ftp;
}
}
package ftp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.SocketException;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
/*该类封装了访问FTP服务器的操作*/
public class FtpUtil {
private FtpBean ftpBean = null;
private FTPClient ftp = null;
public FtpUtil() {
}
/* 获取一个FtpBean对象,该对象包含上传下载的操作的基本参数 */
public FtpBean getFtpBean() {
return ftpBean;
}
/* 设置一个FtpBean对象 */
public void setFtpBean(FtpBean ftpBean) {
this.ftpBean = ftpBean;
}
/* 让客户端和FTP服务器进行连接,但未登录 */
public Boolean openConnection() {
ftp = ftpBean.getFtp();
Boolean flag = true;
ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true));
try {
ftp.connect(ftpBean.getUrl(), ftpBean.getPort()); // 连接FTP服务器
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
System.out.println("服务器拒绝连接!");
return false;
}
} catch (SocketException e) {
// TODO Auto-generated catch block
flag = false;
e.printStackTrace();
flag = false;
} catch (IOException e) {
// TODO Auto-generated catch block
flag = false;
e.printStackTrace();
}
return flag;
}
/* 通过用户名和密码登录到FTP服务器 */
public Boolean loginServer() {
ftp = ftpBean.getFtp();
Boolean flag = true;
try {
if (!ftp.login(ftpBean.getUsername(), ftpBean.getPassword())) {
System.out.println("登录失败!");
return false;
}
ftp.enterLocalPassiveMode(); // 设置为被动模式
// 二进制传输,默认为ASCII
ftp.setFileType(FTP.BINARY_FILE_TYPE);
} catch (IOException e) {
// TODO Auto-generated catch block
flag = false;
e.printStackTrace();
}
return flag;
}
/* 上传文件 */
public Boolean uploadFile() {
ftp = ftpBean.getFtp();
InputStream input = null;
Boolean flag = false;
try {
input = new FileInputStream(ftpBean.getLocalFile());
flag = ftp.storeFile(ftpBean.getRemoteFile(), input); // 上传文件
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
/* 下载文件 */
public Boolean downloadFile() {
ftp = ftpBean.getFtp();
OutputStream output = null;
Boolean flag = false;
try {
output = new FileOutputStream(ftpBean.getLocalFile());
flag = ftp.retrieveFile(ftpBean.getRemoteFile(), output); // 下载文件
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
/* 创建FTP服务器上的目录 */
public Boolean makeDir() {
ftp = ftpBean.getFtp();
Boolean flag = false;
try {
flag = ftp.makeDirectory(ftpBean.getDirectory()); // 创建目录
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
/* 删除FTP服务器上的目录 */
public Boolean deleteDir(String ftpPath) {
ftp = ftpBean.getFtp();
FTPFile[] files = null;
String path = ""; // 存放递归的目录
Boolean flag = false;
try {
files = ftp.listFiles(ftpPath); // 获取该路径下所有文件
// 递归删除目录下的目录和文件
for (FTPFile f : files) {
path = ftpPath + File.separator + f.getName();
if (f.isFile()) { // 如果是文件直接删除
ftp.deleteFile(path);
} else if (f.isDirectory()) { // 如果是目录继续递归
deleteDir(path);
}
}
FTPFile[] files1 = ftp.listFiles(ftpPath);
if (files1.length == 0) { // 如果该路径下只是空文件夹,直接删除
flag = ftp.removeDirectory(ftpPath);
} else {
flag = false;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
/* 关闭与FTP服务器的连接 */
public Boolean closeConnection() {
ftp = ftpBean.getFtp();
Boolean flag = false;
try {
ftp.noop();
flag = ftp.logout(); // 登出FTP服务器
if (ftp.isConnected()) {
ftp.disconnect(); // 断开连接
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
}
package ftp;
import java.io.File;
import java.util.Scanner;
import org.apache.commons.net.ftp.FTPClient;
/*该类为FTP客户端,调用前面FtpUtil类中的方法*/
public class Ftp_Client {
static FtpBean ftpBean = new FtpBean(); // 封装上传下载等操作的参数的对象
static FtpUtil ftpUtil = null; // 封装对FTP服务器的各种操作的类
static FTPClient ftp = null;
static Boolean flag = false; // 操作成功与否的标识
String path = ""; // 要删除的FTP服务器上目录路径
/* 连接服务器操作 */
public static Boolean connect() {
Scanner input = new Scanner(System.in);
System.out.print("服务器地址:ftp://");
ftpBean.setUrl(input.next());
System.out.print("\n服务器端口:");
ftpBean.setPort(input.nextInt());
System.out.print("\n用户名:");
ftpBean.setUsername(input.next());
System.out.print("\n密码:");
ftpBean.setPassword(input.next());
ftp = new FTPClient();
ftp.setControlEncoding("GBK"); // 让FTP服务器上文件能够支持中文命名
ftpBean.setFtp(ftp);
ftpUtil = new FtpUtil();
ftpUtil.setFtpBean(ftpBean);
ftpUtil.openConnection();
flag = ftpUtil.loginServer();
if (flag)
System.out.println("连接成功!");
else
System.out.println("连接失败!");
return flag;
}
/* 上传文件操作 */
public static void upload() {
Scanner input = new Scanner(System.in);
System.out.print("本地文件的路径:");
ftpBean.setLocalFile(input.next());
System.out.print("远程文件的路径:");
ftpBean.setRemoteFile(input.next());
flag = ftpUtil.uploadFile();
if (flag)
System.out.println("上传成功!");
else
System.out.println("上传失败!");
}
/* 下载文件操作 */
public static void download() {
Scanner input = new Scanner(System.in);
System.out.print("本地文件的路径:");
ftpBean.setLocalFile(input.next());
System.out.print("远程文件的路径:");
ftpBean.setRemoteFile(input.next());
flag = ftpUtil.downloadFile();
if (flag)
System.out.println("下载成功!");
else
System.out.println("下载失败!");
}
/* 创建目录操作 */
public static void mkdir() {
Scanner input = new Scanner(System.in);
System.out.print("目录名称:");
ftpBean.setDirectory(input.next());
flag = ftpUtil.makeDir();
if (flag)
System.out.println("创建成功!");
else
System.out.println("创建失败!");
}
/* 删除目录操作 */
public static void deldir() {
Scanner input = new Scanner(System.in);
System.out.println("目录名称:");
flag = ftpUtil.deleteDir(input.next());
if (flag)
System.out.println("删除成功!");
else
System.out.println("删除失败!");
}
/* 关闭FTP连接操作 */
public static void close() {
flag = ftpUtil.closeConnection();
if (flag)
System.out.println("关闭成功!");
else
System.out.println("关闭失败!");
}
/* FTP服务器客户端 */
public static void ftpInterface() {
Scanner input = new Scanner(System.in);
String command = "";
int q = 0, p = 0;
Boolean f = true;
System.out.println("FTP客户端:\n\n说明:");
System.out.println("connect:连接FTP服务器\nupload:上传文件\n" + "download:下载文件\nmkdir:创建FTP服务器上的目录\n"
+ "deldir:删除FTP服务器上的目录\nclose:关闭与FTP服务器的连接\n" + "over:退出FTP客户端程序");
System.out.println("提示:做任何操作前请先连接FTP服务器!\n");
while (!command.equals("over")) {
System.out.print("\n请输入您的命令:");
command = input.next();
if (command.equals("connect")) {
q = 1;
f = connect();
if (f)
break;
} else {
System.out.println("请先连接FTP服务器!");
}
}
if (q == 1) {
while (true) {
System.out.print("请输入您的命令:");
command = input.next();
if (p == 0) {
switch (command) {
case "connect":
if (ftp.isConnected())
ftpUtil.closeConnection();
connect();
break;
case "upload":
upload();
break;
case "download":
download();
break;
case "mkdir":
mkdir();
break;
case "deldir":
deldir();
break;
case "close":
close();
p = 1;
break;
case "over":
q = 0;
break;
default:
System.out.println("无效的命令!");
}
}
if (q == 0) {
System.out.println("Bye!");
break;
}
if (command.equals("connect") && p == 1) {
p = 0;
connect();
} else if (command.equals("over") && p == 1) {
p = 0;
q = 0;
System.out.println("Bye!");
break;
} else if (p == 1 && !command.equals("connect")) {
System.out.println("请先连接FTP服务器或直接退出!");
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ftpInterface();
}
}