2015-12-11 4 views
1

Я изменяю код, который ранее работал с библиотекой FTPS, которую я написал сам. Меня попросили начать использовать библиотеку Apache Commons Net (главным образом FTPClient и FTPSClient), и я столкнулся с проблемами, связанными с списком файлов. Я читал другие вопросы, и это не проблема enterLocalPassiveMode (Apache Commons Net FTPClient and listFiles()), поскольку я использую это после подключения, но перед входом в систему. Тот же код отлично работает на тестовом сервере, который я настроил (также используя Apache FTP), но не работает на сервере, в котором я нуждаюсь.Apache Commons Net FTPClient не будет выполнять listFiles()

Я также пытался использовать команды «PBSZ 0» и «PROT P», но они не реализованы в удаленной системе.

502 PBSZ Command not implemented. 
502 PROT Command not implemented. 

Код:

FTPSClient ftpsclient = new FTPSClient(true); // Implicit SSL 
ftpsclient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true)); 
ftpsclient.connect(HOST_ADDR, HOST_PORT); // Using port 990 
ftpsclient.enterLocalPassiveMode(); 
ftpsclient.user(USERID); 
ftpsclient.pass(PASSWORD); 
ftpsclient.setFileType(FTP.BINARY_FILE_TYPE); 
ftpsclient.changeWorkingDirectory(REMOTE_DIR); 
ftpsclient.printWorkingDirectory(); 
FTPFile[] ftpfiles = ftpsclient.listFiles(); // This is where it breaks 

Я пытался указать директорию, в явном виде и использование по умолчанию:

FTPFile[] ftpfiles = ftpsclient.listFiles(); 
FTPFile[] ftpfiles = ftpsclient.listFiles(REMOTE_DIR); 

... но и дают тот же результат. Это выход информации отладки:

220 FTPS (Version Thu Dec 10 17:23:00 2015) server ready. 
USER **** 
331 Password required for ****. 
PASS **** 
230 User **** logged in. 
TYPE I 
200 Type set to I 
CWD outbound/directory 
250 CWD Command successful. 
PWD 
257 "/usr/path/to/outbound/directory" is current directory. 
SYST 
215 UNIX 
PASV 
227 Entering Passive Mode (XX,XX,XX,XX,24,140) ***Edit: port 6284 
LIST 
150 Opening data connection for '/bin/ls'. 

Тогда раз через 30 секунд с этой трассировки стека:

Stack Trace: org.apache.commons.net.ftp.FTPConnectionClosedException: Connection closed without indication. 
    at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:317) 
    at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:294) 
    at org.apache.commons.net.ftp.FTP.getReply(FTP.java:692) 
    at org.apache.commons.net.ftp.FTPClient.completePendingCommand(FTPClient.java:1813) 
    at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:3308) 
    at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:3271) 
    at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2930) 

Я проверил мои настройки брандмауэра и хоста разрешено подключение через порт 990 и 6200-6300.

Я также читал FTPClient.listFiles not working и Java application hanging during LIST command to FTP Server (Apache Commons FTPClient), и ни одна из них не помогла с моей проблемой.

EDIT: Похоже, что FTPClient не распознает канал данных. Я попытался загрузить файл вместо записи, и он умер после сообщения «150 Открытие данных». Я подтвердил, что порты, назначенные для соединения данных из команды PASV, НЕ блокируются нашим брандмауэром.

Любые идеи?

+0

Можете ли вы подключиться к автономному FTP-клиенту с одного компьютера на тот же сервер, используя пассивный режим? –

+0

В настоящее время я пытаюсь проверить, могу ли я использовать cURL для подключения, но локальная машина - это сервер AIX, с которым я ограничен. –

ответ

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^