Java: получение соединения отказано при попытке загрузить файл на FTP - PullRequest
0 голосов
/ 25 апреля 2018

При попытке загрузить файл на FTP с помощью Java-программы:

public void upload(String localFile,String remoteFile) throws Exception{
       ftp = new FTPClient(); 
       ftp.setControlKeepAliveTimeout(300);
       ftp.connect(host,21);    
       ftp.enterLocalPassiveMode();     
       ftp.setUseEPSVwithIPv4(false);   
       ftp.login(user,password);    
       ftp.setFileType(FTPClient.BINARY_FILE_TYPE);      

       FileInputStream in = null;
       in = new FileInputStream(localFile);
       ftp.storeFile(remoteFile,in);
       in.close();  
       ftp.disconnect();

}

Я получаю:

java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:381)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:243)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:230)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:377)
    at java.net.Socket.connect(Socket.java:539)
    at org.apache.commons.net.SocketClient._connect(SocketClient.java:243)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:202)

Когда я пытаюсь загрузить тот же файл с помощью командной строки (изLinux), я могу сделать это только при использовании EPSV:

llnx:~ ftp anonymous@9.20.1.116
Connected to 9.20.1.116.
220 Microsoft FTP Service
331 Anonymous access allowed, send identity (e-mail name) as password.
Password:
230 User logged in.
Remote system type is Windows_NT.
ftp> epsv
EPSV/EPRT on IPv4 off.
ftp> put /tmp/file1.xml /dir_1/file1.xml
local: /tmp/file1.xml remote: /dir_1/file1.xml
227 Entering Passive Mode (10,40,1,149,233,168).
125 Data connection already open; Transfer starting.
100% |*************************************|   117 KB   28.66 MB/s    --:-- ETA
226 Transfer complete.
120032 bytes sent in 00:00 (7.96 MB/s)

Итак, почему мой Java-код получает соединение отказано?

Может быть, я не использую enterLocalPassiveMode () или setUseEPSV с IPv4 () правильным способом?

*** Я думаю, что ответ в том, как запустить команду EPSV из Java-программы.

Спасибо всем.Eithan.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Отказ в соединении означает, что ваш запрос TCP-соединения достиг удаленного сервера (или, точнее, >> << удаленного сервера), но сервер не ожидает / не ожидает входящего соединения.Поэтому он «отказывается» от него. </p>

Вот что нужно проверить:

  • Убедитесь, что у вас есть правильное имя удаленного хоста или IP-адрес для FTP-сервера.
  • Убедитесь, что вы используете правильный порт для FTP-сервера.Порт 21 используется по умолчанию, но возможно , если сервер подключен к нестандартному порту.
  • Убедитесь, что FTP-сервер действительно работает.

Также возможно, что проблема связана с тем, что брандмауэр делает что-то намеренно запутанное.Но это маловероятно для публично маршрутизируемого FTP-сервера.


Может быть, я не использую метод enterLocalPassiveMode () или setUseEPSVwithIPv4 () правильным способом?

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

0 голосов
/ 25 апреля 2018

Это чисто предположение, но java.net.ConnectException: Connection refused обычно происходит, когда на целевом хосте / порте ничего не прослушивается.Вы не указываете порт в примере CLI, так что, возможно, в этом проблема.Попробуйте изменить ftp.connect(host,21); на ftp.connect(host);, чтобы использовать значение по умолчанию.Также убедитесь, что имена хостов точно такие же.

Предполагается, что ошибка при вызове connect().Вы не предоставили достаточно большую трассировку стека, чтобы указать в любом случае.

...