2011-02-23 74 views
1

我有一个奇怪的问题,我的本地测试设置简单的Java URL FTP连接。 下面的代码片段(除去尝试/捕获):Java与FileZilla的FTP连接问题

URL url = new URL("ftp://127.0.0.1/subOne/subTwo/subThree/subFour"); 
URLConnection conn = url.openConnection(); 
conn.setConnectTimeout(30000); 
conn.setReadTimeout(30000); 

InputStream is = conn.getInputStream(); /// And here flies the IOException! 

...实际IOException异常,原因是“子一/子二/子三/子四”,但有趣的事情发生在服务器端:

(000012)23.02.2011 13:01:05 - (not logged in) (127.0.0.1)> Connected, sending welcome message... 
(000012)23.02.2011 13:01:05 - (not logged in) (127.0.0.1)> 220 Blabla 
(000012)23.02.2011 13:01:05 - (not logged in) (127.0.0.1)> USER anonymous 
(000012)23.02.2011 13:01:05 - (not logged in) (127.0.0.1)> 331 Password required for anonymous 
(000012)23.02.2011 13:01:05 - (not logged in) (127.0.0.1)> PASS ************* 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> 230 Logged on 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> TYPE I 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> 200 Type set to I 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> CWD das 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> 250 CWD successful. "/subOne" is current directory. 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> CWD 2011 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> 250 CWD successful. "/subOne/subTwo" is current directory. 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> CWD 02 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> 250 CWD successful. "/subOne/subTwo/subThree" is current directory. 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> EPSV ALL 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> 229 Entering Extended Passive Mode (|||3881|) 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> EPSV 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> 229 Entering Extended Passive Mode (|||3882|) 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> RETR subFour 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> 550 File not found 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> CWD subOne 
(000012)23.02.2011 13:01:05 - anonymous (127.0.0.1)> 550 CWD failed. "/subOne/subTwo/subThree/subOne": directory not found. 
(000012)23.02.2011 13:03:06 - anonymous (127.0.0.1)> 421 Connection timed out. 
(000012)23.02.2011 13:03:06 - anonymous (127.0.0.1)> disconnected. 

我不明白,因何测试仪试图进入扩展被动模式和为什么它添加子一后不能取回子四

我刚刚安装了FileZilla Server并设置了匿名用户和共享驱动器。我通过浏览器和FileZilla-Client检查了FTP-Dir是否可以访问(当然是登录),就是这样。 一切都安装在同一台机器上运行!

不知道任何进一步的...

感谢您的帮助!

回答

4

这种方式连接到FTP是相当有限和模糊记录。我可以先给你答复EPSV。该连接由内部实现建立,在我的JDK中恰好是sun.net.www.protocol.ftp.FtpURLConnection

当连接到服务器的第一EPSVPASV将尝试(默认为被动模式),那么它会回落到活动模式 - PORT - 如果被动模式不能被建立。你可以看到实施细节here

基本解释评论你的问题之一是:

/** 
    * Here is the idea: 
    * 
    * - First we want to try the new (and IPv6 compatible) EPSV command 
    * But since we want to be nice with NAT software, we'll issue the 
    * EPSV ALL cmd first. 
    * EPSV is documented in RFC2428 
    * - If EPSV fails, then we fall back to the older, yet OK PASV command 
    * - If PASV fails as well, then we throw an exception and the calling method 
    * will have to try the EPRT or PORT command 
    */ 

关于你的第二个问题... 子四的失败检索...好吧,先快速浏览一下,似乎是表现方式,因为它是越野车。但我现在无法真正安装适当的环境来验证。此外,你有例外。我猜想当它试图再次导航到完整路径时,问题在第455行开始。 FTP连接的完整来源是here

373  public InputStream getInputStream() throws IOException { 
    ... 
    390   try { 
    391    decodePath(url.getPath()); 
    392    if (filename == null || type == DIR) { 
    ... 
    399    } else { 
    400     if (type == ASCII) 
    401      ftp.ascii(); 
    402     else 
    403      ftp.binary(); 
    404     cd(pathname); 
    405     is = new FtpInputStream(ftp, ftp.get(filename)); 
    406    } 
    407 
    408 
    ... 
    453   } catch (FileNotFoundException e) { 
    454    try { 
    455     cd(fullpath); 
    456     /* if that worked, then make a directory listing 
    457      and build an html stream with all the files in 
    458      the directory */ 
    459     ftp.ascii(); 
    460 
    461     is = new FtpInputStream(ftp, ftp.list()); 
    462     msgh.add("content-type", "text/plain"); 
    463    } catch (IOException ex) { 
    464     throw new FileNotFoundException(fullpath); 
    465    } 
    466   } 
    ... 
    469  } 

我会建议你使用Apache Commons Net库FTP操作。它使用起来更加先进和直接。

如果您喜欢,欢呼和快乐调试!

+0

很好的答案,@lucho。 – andersoj 2011-02-23 13:42:56

+0

感谢您的时间和答案!我担心这个可能会深埋在JDK中以解决简单的问题...我将尝试Apache Commons ...再次感谢! – Gruber 2011-02-23 14:11:33