最近需要通过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防火墙不兼容导致。
再从百度中搜索,java7+ FTP,就可以发现许多对于此问题的解决方法。我直接将我的编译环境设置到 java 6 ,我的第一段代码就能正常使用了,特此记录!