使用FTPClient获取FTP站点文件列表时遇到的问题

时间:2022-03-05 08:16:40

最近需要通过org.apache.commons.net,从服务器读取一系列文件信息,发现遇到了一个诡异的问题,

 1     public static String downloadFile() throws Exception{
 2     {
 3         FTPClient ftp = new FTPClient();
 4         ftp.connect("xxx.xxx.xxx.xxx", 21);
 5         ftp.login("xx", "xx");
 6         if (ftp.isConnected()) {
 7             String dir = ftp.printWorkingDirectory();
 8              ftp.cwd("/pcf/");
 9             dir = ftp.printWorkingDirectory();
10             System.out.println(dir);   
11             return Arrays.toString(ftp.listNames (dir));
12         } else {
13             return "error";
14         }
15     }

在运行的11行时,报了出了一个异常Exception in thread "main" java.net.SocketException: Software caused connection abort: socket write error,百度之,未能找到解决办法。然后上网检索FTPClient使用的示例代码,发现在示例中,登陆后需要设置被动模式

 1      public static String downloadFile() throws Exception
 2      {
 3          FTPClient ftp = new FTPClient();
 4          ftp.connect("xxx.xxx.xxx.xxx", 21);
 5          ftp.login("xx", "xxx");
 6          if (ftp.isConnected()) {
 7              System.out.println(ftp.getReplyCode());
 8              String dir = ftp.printWorkingDirectory();
 9              System.out.println(dir);
10              ftp.cwd("/pcf/");
11              dir = ftp.printWorkingDirectory();
12              System.out.println(dir);
13              ftp.enterLocalPassiveMode();//设为被动模式
14              ftp.setFileType(FTP.BINARY_FILE_TYPE); //不设为二进制传送模式,会收不到0x0D 
15              return Arrays.toString(ftp.listNames (dir));
16          } else {
17              return "error";
18          }
19      }

这时异常还是存在,但改变为 Exception in thread "main" java.net.SocketException: Permission denied: recv failed。

通过百度发现,如图搜索结果中的软件,在他的FAQ中提到,这是由于java7的bug,导致与win7防火墙不兼容导致。

使用FTPClient获取FTP站点文件列表时遇到的问题

再从百度中搜索,java7+ FTP,就可以发现许多对于此问题的解决方法。我直接将我的编译环境设置到 java 6 ,我的第一段代码就能正常使用了,特此记录!