Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с получением листинга каталога по FTP 
V
    Опции темы
loginof
Дата 30.6.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.6.2010

Репутация: нет
Всего: нет



Доброго времени суток.
Для работы с FTP сервером использую org.apache.commons.net.ftp
Задача простая: получить и вывести листинг содержимого какой-то директории сервера.
Имеется следующий код, который должен бы это делать, но не делает:
Код

public class FTPProvider extends AbstractProvider {

    private FTPClient client = new FTPClient();
    private String currentHost;

    public FTPProvider(String host) throws SocketException, IOException {
        initConnection(host);
    }

    public List<AbstractContainer> getContent(AbstractContainer target) {
        List<AbstractContainer> content = new ArrayList<AbstractContainer>();
        try {
            //Смена рабочего каталога.
            String folder = "debian";
            client.changeWorkingDirectory(folder);
            System.out.println(client.getReplyString());
            client.printWorkingDirectory();
            System.out.println(client.getReplyString());

            //!!!Дальше все замирает, хотя должен выводиться листинг директории ftp.debian.org/debian
            FTPListParseEngine engine = client.initiateListParsing();
            //!!!

            System.out.println(client.getReplyString());
            while (engine.hasNext()) {
                //Тягаем файлы по одному для наглядности.
                FTPFile[] file = engine.getNext(1);
                //Вот здесь имя должно бы и выводиться:
                System.out.println(file[0].getName());
                boolean accessibility;
                if (file[0].isDirectory()) {
                    accessibility = true;
                }
                else {
                    accessibility = false;
                }
                FTPContainer subCont = new FTPContainer(target, file[0].getName(), accessibility);
                content.add(subCont);
            }
            client.logout();
            client.disconnect();

            //Этот код тоже не работает.
            /*FTPFile[] array = client.listFiles(folder);
            for (int i = 0; i < array.length; i++) {
                FTPFile entry = array[0];
                String name = entry.getName();
                System.out.println(name);
                boolean accessibility;
                if (entry.isDirectory()) {
                    accessibility = true;
                }
                else {
                    accessibility = false;
                }
                FTPContainer subCont = new FTPContainer(target, name, accessibility);
                content.add(subCont);
            }*/
            return content;
        }
        catch(Exception exc) {
            exc.printStackTrace();
            return null;
        }
    }
 
    private void initConnection(String host) throws SocketException, IOException {
        client.connect("ftp.debian.org");
        int reply = client.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            client.disconnect();
            throw new ConnectException("FTP server refused connection!");
        }
        System.out.println("Connected to " + host + " successful.");

        if (client.login("anonymous", "anonymous@email")) {
            currentHost = host;
            System.out.println("Login to " + host + " successful.");
        }
        else {
            client.disconnect();
            throw new ConnectException("Bad login!");
        }
    }

}

Оба варианта получения листинга не работают. Хотя все делаю как описано в документации на библиотеку.
Для упрощения сервер жестко прописан, хотя, конечно, должен задаваться через конструктор провайдера.
Пробовал другие сервера, везде все также. Коннект есть, логин есть, дальше ничего.

В System.out идет вывод:
Цитата

       Connected to ftp.debian.org successful.
       Login to ftp.debian.org successful.
       250 Directory successfully changed.

       257 "/debian"

И все... Дальше билд приложения не идет (юзаю NetBeans).
Проблема где-то на поверхности, но голова уже совсем не варит, работа встала >_<
Помогите, пожалуйста. В инете искал: везде проблема в основном с получением/отдачей файлов сервера.
I need help!!!  smile 
PM MAIL   Вверх
loginof
Дата 30.6.2010, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.6.2010

Репутация: нет
Всего: нет



Как всегда забыл сказать...
Эксепшены никакие не вылетают, с настройками клиента игрался, по-разному пробовал, все без толку.

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

Это сообщение отредактировал(а) loginof - 1.7.2010, 13:30
PM MAIL   Вверх
LSD
Дата 1.7.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



У тебя прямое подключение к интернету?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
loginof
Дата 1.7.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.6.2010

Репутация: нет
Всего: нет



Прямое, без прокси. 
Файрволл тоже ни на что не влияет, проверял :(
PM MAIL   Вверх
Skipy
Дата 2.7.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 4
Всего: 16



Вы знаете, я попробовал простейший вариант, приведенный в документации по FTPClient:

Код
FTPClient client = new FTPClient();
client.connect("server");
client.login("login","password");
FTPFile[] files = client.listFiles("public_html");
for (FTPFile f : files){
    System.out.println(f.getName());
}


Он мне вывел полный список файлов. Соединялся с ftp-сервером на собственном сайте.

Это сообщение отредактировал(а) Skipy - 2.7.2010, 11:40


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
Skipy
Дата 2.7.2010, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 4
Всего: 16



Попробовал Ваш вариант - подключился к ftp.debian.org, запросил список файлов через FTPListParseEngine. Сервер съел и не поморщился. Выдал результат:

Код
FTPClient client = new FTPClient();
client.connect("ftp.debian.org");
System.out.println(client.getReplyString());
client.login("anonymous", "anonymous@email");
System.out.println(client.getReplyString());
client.changeWorkingDirectory("debian");
System.out.println(client.getReplyString());
FTPListParseEngine en = client.initiateListParsing();
while(en.hasNext()){
    FTPFile[] files = en.getNext(20);
    for (FTPFile f : files){
        System.out.println(f.getRawListing());
    }
}
client.disconnect();


Код
220 ftp.debian.org FTP server

230 Login successful.

250 Directory successfully changed.

-rw-rw-r--    1 1176     1176          939 Jun 26 09:52 README
-rw-rw-r--    1 1176     1176         1290 Jun 26 09:52 README.CD-manufacture
-rw-rw-r--    1 1176     1176         2292 Jun 26 09:52 README.html
-rw-r--r--    1 1176     1176       137318 Jun 26 09:52 README.mirrors.html
-rw-r--r--    1 1176     1176        72789 Jun 26 09:53 README.mirrors.txt
drwxr-sr-x    8 1176     1176         4096 Jun 26 09:55 dists
drwxr-sr-x    4 1176     1176         4096 Jul 02 01:52 doc
drwxr-sr-x    3 1176     1176         4096 Jul 02 03:24 indices
-rw-r--r--    1 1176     1176      5413515 Jul 02 03:24 ls-lR.gz
-rw-r--r--    1 1176     1176       144463 Jul 02 03:24 ls-lR.patch.gz
drwxr-sr-x    5 1176     1176         4096 Dec 19  2000 pool
drwxr-sr-x    4 1176     1176         4096 Nov 17  2008 project
drwxr-xr-x    2 1176     1176         4096 Feb 07  2009 tools


Имхо, единственно, что Вам остается - во-первых, проверить код на другой машине, во-вторых, поставить сетевой сниффер и посмотреть, что ходит по сети в тот момент, когда у Вас всё виснет.

Это сообщение отредактировал(а) Skipy - 2.7.2010, 12:03


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
loginof
Дата 7.7.2010, 05:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.6.2010

Репутация: нет
Всего: нет



Друзья, все оказалось гораздо прозаичнее... Mea culpa как говорится.
Дело в том, что DHCP сервер провайдера почти всегда дает мне "белый" адрес (наверное, потому, что ноут практически в круглосуточном аптайме smile ), но у них есть еще NAT, за которым "серые" адреса. Видимо, в этом все и дело. Поэтому очевидно на вопрос LSD я дал на тот момент некорректный ответ, за что прошу меня извинить  smile  Выяснилось это при проверке на другой машине, которая точно была за натом.

За NAT в активном режиме (а он дефолтный) FTP сервер не подключится, конечно же. Поэтому переходим в пассивный режим, чтобы клиент сам подключался к серверу на присланный им порт. Для этого добавляем строчку непосредственно перед запросом листинга каталога:

Код

client.enterLocalPassiveMode();


и наслаждаемся выводом директорий  smile 
Есть сервера, которые не поддерживают пассивный режим, но их, кажется, мало осталось.
Может, кому-нибудь поможет не наступить на такие же грабли. Вопрос закрыть можно.

Это сообщение отредактировал(а) loginof - 7.7.2010, 05:12
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.