简单FTP客户端

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();
	}

}


  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
简单FTP服务器,供大家参考.版本 2 命令文本 = 到大写 (到文本 (服务器1.取回数据 ())) 命令文本 = 子文本替换 (命令文本, #换行符, , , , 真) .判断开始 (取文本左边 (命令文本, 4) = “USER”) ' 用户名 .如果真 (PASS (命令文本)) 服务器1.发送数据 (客户信息, “331 ” + #换行符, ) 返回 () .如果真结束 服务器1.发送数据 (客户信息, “530 ” + #换行符, ) .判断 (取文本左边 (命令文本, 4) = “PASS”) ' 密码,这里采用匿名的方式登陆 .如果真 (匿名) 服务器1.发送数据 (客户信息, “230 ” + #换行符, ) 返回 () .如果真结束 服务器1.发送数据 (客户信息, “530 ” + #换行符, ) .判断 (命令文本 = “OPTS UTF8 ON”) ' 路径采用UTF8编码 ' UTF8编码 = 真 服务器1.发送数据 (客户信息, “503 ” + #换行符, ) ' 暂时不支持utf8编码 .判断 (命令文本 = “SYST” 或 命令文本 = “SITE HELP”) 服务器1.发送数据 (客户信息, “215 近在眼前 FTP Server” + #换行符, ) .判断 (命令文本 = “PWD”) 服务器1.发送数据 (客户信息, “257 ” + #引号 + 目录 + #引号 + #换行符, ) .判断 (命令文本 = “TYPE A”) .如果真 (文件号 ≠ 0) 关闭文件 (文件号) 文件号 = 0 .如果真结束 服务器1.发送数据 (客户信息, “200 ” + #换行符, ) .判断 (取文本左边 (命令文本, 3) = “CWD”) ' 改变工作目录 .如果 (取文本长度 (命令文本) > 5) 服务器1.发送数据 (客户信息, “550 近在眼前友情提示:目前还不支持改变目录!” + #换行符, ) .否则 服务器1.发送数据 (客户信息, “250 ” + #引号 + 目录 + #引号 + #换行符, ) .如果结束 .判断 (命令文本 = “PASV”) ' 采用被动方式连接 IP = PASV (端口) 服务器2.端口 = 端口 服务器1.发送数据 (客户信息, “227 Entering Passive Mode (” + IP + “)” + #换行符, ) .判断 (命令文本 = “LIST”) ' 列表 服务器1.发送数据 (客户信息, “150 ” + #换行符, ) 发送数据 = 发送列表 (根目录 + 目录) 服务器2.发送数据 (数据客户, 发送数据, ) 服务器2.断开客户 (数据客户) 服务器1.发送数据 (客户信息, “226 Transfer complete” + #换行符, ) .判断 (命令文本 = “NOOP”) 服务器1.发送数据 (客户信息, “200 ” + #换行符, ) .判断 (命令文本 = “TYPE I”) 服务器1.发送数据 (客户信息, “200 ” + #换行符, ) .判断 (命令文本 = “SIZE”) 服务器1.发送数据 (客户信息, “421 ” + #换行符, ) .判断 (取文本左边 (命令文本, 4) = “QUIT”) 服务器1.发送数据 (客户信息, “220 再来我揍你!” + #换行符, ) 服务器1.断开客户 (客户信息) .默认 服务器1.发送数据 (客户信息, “550 近在眼前友情提示:暂时不支持该功能!” + #换行符, ) ' 其它命令你们自行扩展,这里暂时屏蔽
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值