Проблема FTP-соединения с Java с FileZilla - PullRequest
1 голос
/ 23 февраля 2011

У меня странная проблема с моей локальной настройкой тестирования простого FTP-соединения с URL-адресом Java.Следующие фрагменты кода (удалено try / catches):

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 - subOne / subTwo / subThree / subFour, но на стороне сервера происходят забавные вещи:

(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.

Я вообще не понимаю, почему Тестер пытается перейти в расширенный пассивный режим и почему он добавляется subOne после того, как не может получить subFour .

Я только что установил сервер FileZilla и настроил анонимного пользователя и общие диски.Я проверил через браузер и FileZilla-Client, что FTP-Dir доступен (те же логины, конечно) и все.Все установлено и работает на одной машине!

Больше не знаю ...

Спасибо за любую помощь!

1 Ответ

4 голосов
/ 23 февраля 2011

Этот способ подключения к FTP довольно ограничен и не до конца документирован. Я могу сначала дать вам ответ на EPSV. Соединение устанавливается внутренней реализацией, которая в моем JDK оказывается sun.net.www.protocol.ftp.FtpURLConnection.

При подключении к серверу сначала будут опробованы EPSV и PASV (по умолчанию пассивный режим), затем он вернется к активному режиму - PORT - если пассивный режим не может быть установлен. Вы можете увидеть детали реализации здесь .

Основной комментарий, объясняющий один из ваших вопросов:

 /**
  * 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
  */

Что касается вашего второго вопроса ... неудачный поиск subFour ... Что ж, на первый взгляд кажется, что он ведет себя так, потому что он глючит. Но я не могу установить правильную среду, чтобы проверить это сейчас. Далее у вас есть исключение. Я предполагаю, что проблема инициируется в строке 455, когда она пытается снова перейти к полному пути. Полный источник FTP-соединения здесь .

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. Он намного более продвинут и прост в использовании.

Приветствия и счастливой отладки, если вы хотите!

...