FTP协议简介
-
FTP协议是互联网上使用最广泛的文件传输协议
-
采用客户端/服务器模式,基于TCP协议
-
FTP采用双TCP连接方式
→控制连接使用TCP端口号21
→数据连接使用TCP端口21
-
FTP有两种文件传输模式
-
FTP采用两种数据传输方式
→主动方式
在建立数据连接过程中,由服务器主动发起连接,因此被称为主动方式
→被动方式
由于建立数据通道时,FTP服务器被动等待FTP客户端的连接,因此称为被动模式
-
控制连接
→用于FTP客户端和FTP服务器之间传输FTP控制命令及命令执行信息。控制连接在整个会话期间一直保持打开
-
数据连接
→用于传输数据,包括数据上传、下载、文件等。数据传输结束后数据连接将终止
-
ASCII模式是默认的文件传输模式,主要特点是:
→本地文件转换成标准的ASCII码再传输
→适用于传输本地文件
-
二进制流模式,主要特点是:
→文件按照比特流的方式进行传输
→适用于传送图片、mp3、mp4等格式的文件
Java语言实现基于FTP服务器的文件传输
首先,需要下载好第三方的FTP服务器,我们只需要简单的设置用户名,登录密码,上传的目录及一些权限即可,大大方便了我们的操作。假设我的服务器地址是(192.168.254.12),账号:admin,密码:admin
为了简单起见,我们假设FTP服务器和FTP客户端处于同一局域网中。
文件的上传
public class Upload{
public static void main(String[] args){
FTPClient ftpClient = new FTPClient();
//创建文件输入流,用于读取本地的文件
try(FileInputStream localIn = new FileInputStream("c:\\test\\jay.jpg")){
//连接FTP服务器
FTPClient.connect("192.168.254.12");
//登录
FTPClient.login("admin","admin");
//存储文件(将本地文件上传至FTP服务器)
//参数1:FTP服务器的存储位置(目录+文件名)
//参数2:本地的文件输入流
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//存储前设置文件类型
ftpClient.storeFile("dir/jay.jpg",localIn);//存储
}catch(SocketException e){
e.printStackTrace();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
//关闭服务器连接
ftpClient.disconnect();
}catch (IOexception e)
e.printStackTrace();
}
}
}
文件的下载
public class download{
public static void main(String[] args){
FTPClient ftpClitent = new FTPClient();
//选择需要下载的目录
File uploadDir = new File("D:\\JavaTest\\download");
//判断当前目录是否存在
if (!uploadDir.exists()) {
//如果不存在,创建这个目录
uploadDir.mkdir();
}
//创建文件输出流,用于下载文件时往磁盘里写入
try (FileOutputStream out = new FileOutputStream("D:\\JavaTest\\download\\" +
excelFileName)) {
//连接FTP服务器
ftpClitent.connect("192.168.254.12", 21);
//登录
boolean isLogin = ftpClitent.login("admin", "admin");
//查看是否登录成功
System.out.println("登录成功?" + isLogin);
//下载文件
ftpClitent.setFileType(FTPClient.BINARY_FILE_TYPE);
//判断是否下载成功
boolean isretrieve = ftpClitent.retrieveFile(excelFileName, out);
System.out.println("下载成功?" + isRetrieve);
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
//关闭连接
ftpClitent.disconnect();
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
}
}