一、前言
在测试硬件从ftp服务端下载二进制文件时,发现windows自带的ftp服务器可以下载,而自己通过java搭建的ftp服务器却不能下载成功。查询了网上的的博客并没有查到有效的解决办法,所以只能通过抓包和阅读ftpserver源码的方式进行查找解决。目前客户端采用硬件访问ftp服务器进行获取二进制文件,不着重研究客户端。
二、使用win11自带的IIs管理器创建ftp服务(具体搭建步骤可网上查询,下图是搭建完成的)
三、使用Wireshark软件抓取type I 指令(type I指令是设置文件传输类型为二进制,缺省为ascii)
从上图可以看到,客户端登录后发送了TYPE I指令,服务端回复为 Type set to I. 此时20231214160743.bin文件下载成功
四、使用java代码搭建FTP服务端
1、pom文件引入ftpserver
<!--ftp服务-->
<dependency>
<groupId>org.apache.ftpserver</groupId>
<artifactId>ftpserver-core</artifactId>
<version> 1.1.4 </version>
</dependency>
2、java代码
import org.apache.ftpserver.FtpServer;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.ftplet.Authority;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.usermanager.impl.BaseUser;
import org.apache.ftpserver.usermanager.impl.WritePermission;
import java.util.ArrayList;
import java.util.List;
public class FtpUtils {
public static void main(String[] args) {
createFtpServer();
}
/**
* 创建匿名用户
*/
public static void createFtpServer(){
try {
FtpServerFactory serverFactory = new FtpServerFactory();
BaseUser user = new BaseUser();
user.setName("anonymous");
// user.setPassword("anonymous");
user.setHomeDirectory("D:\\IIsFtpFile\\");
List<Authority> authorities = new ArrayList<>();
//权限
authorities.add(new WritePermission());
user.setAuthorities(authorities);
serverFactory.getUserManager().save(user);
ListenerFactory listener=new ListenerFactory();
listener.setPort(21);
serverFactory.addListener("default", listener.createListener());//覆盖默认监听
FtpServer server = serverFactory.createServer();
server.start();
System.out.println("ftp搭建完成");
}catch (
Exception e){
e.printStackTrace();
}
}
}
3、此时启动服务端,抓取type I 指令
可以发现ftpf服务端指令回复和win11自带ftp服务有所不同,但是匿名登录是成功的。有可能出现 Command TYPE okay.这个回复指令客户端不能解析造成的。
四、ftpserver-core源码粗略分析并解决
由上图可以看到抓包中的回复命令:Command TYPE okay. 可以继续看下defaultProperties配置文件的路径
可以根据路径ora/apache/ftoserver/message/FTpStatus.properties找到配置文件
该文件中有很多配置命令,我们可以修改为200.TYPE=Type set to I. 这里采用比较暴力的方式直接在maven里找到ftpserver-core-1.1.4.jar用压缩工具打开后找到FTpStatus.properties直接修改并保存(学术不精,有其他更合适的方案,可以私发我,向其学习!)