一、先确定虚拟机中是否安装了vsftpd
如果在一开始新建虚拟机的时候勾选了这个,那就无需安装。
检查虚拟机linux系统电脑里是否有vsftpd:
vsftpd -v
查如下图所示说明电脑已经安装vsftp
二、安装vsftpd
否则,需要安装vsftp
yum -y install vsftpd
安装完成后再次执行,查看是否安装成功
vsftpd -v
三、需要创建账户,vsftpd默认不允许root访问
创建一个新的用户,并设置密码
useradd ‐d /home/ftpuser ftpuser
passwd ftpuser
四、查看本机外网访问权限
getsebool ‐a | grep ftp
将上图的两项改为on
setsebool tftp_home_dir on
setsebool ftpd_full_access on
五、启动vsftpd
systemctl start vsftpd
六、程序内使用
导入依赖
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.8.0</version>
</dependency>
String hostname = "192.168.253.151";
int port = 21;
FTPClient ftpClient = new FTPClient();
ftpClient.setControlEncoding("utf-8");
System.out.println("connecting...ftp服务器:" + hostname + ":" + port);
try {
ftpClient.connect(hostname, port);
// 连接ftp服务器
ftpClient.login("ftpuser", "52xzg1314"); // 登录ftp服务器
ftpClient.enterLocalPassiveMode();
int replyCode = ftpClient.getReplyCode(); // 是否成功登录服务器
if (!FTPReply.isPositiveCompletion(replyCode)) {
System.out.println("connect failed...ftp服务器:" + hostname + ":" + port);
}
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
boolean boo = ftpClient.changeWorkingDirectory("/home/ftpuser/");
if (boo) {
System.out.println("进入文件夹成功");
}
InputStream inputStream = new FileInputStream("E:/aEveryWhere/Picture/lock/1.jpg");
System.out.println(ftpClient.storeFile("1.jpg", inputStream));
inputStream.close();
ftpClient.logout();
} catch (IOException e) {
e.printStackTrace();
}
七、报错处理
1.java.net.ConnectException: Connection timed out: connect
需要在root用户下关闭linux虚拟机防火墙
2.java.io.UnsupportedEncodingException: utf‐8
拼写utf-8错误
ftpClient.setControlEncoding("utf-8");
3.注意虚拟机的文件夹是否有读写权限
例如ftpuser用户只对/home/ftpuser/文件有读写权限,所以下图代码应该这样写
boolean boo = ftpClient.changeWorkingDirectory("/home/ftpuser/");
4. ftpClient.enterLocalPassiveMode();位置
网上有说这句话应该在connect之前,但是我写在connect之前会报false,传入的文件大小为0.
更改成下图所示位置正确。
ftp连接需要两次连接,windows和linux防火墙有一些乱七八糟的关系
如果使用主动模式,第一次连接(建立文件的连接)好使第二次(传输内容的连接)就会断掉。
被动模式整体不需要windows支持什么。
5.ftpClient.setBufferSize(1024);
让文件传输更快。
传输速度慢的原因:在IO流上找答案。