URLConnection медленно вызывает getOutputStream, используя URL-адрес FTP - PullRequest
1 голос
/ 13 сентября 2010

У меня есть маленький кусочек кода ниже, который загружает файл в Java, код работает правильно, однако он долго зависает при открытии выходного потока.

// open file to upload
InputStream filein = new FileInputStream("/path/to/file.txt");

// connect to server
URL url = new URL("ftp://user:pass@host/dir/file.txt");
URLConnection urlConn = url.openConnection();
urlConn.setDoOutput(true);

// write file

// HANGS FROM HERE
OutputStream ftpout = urlConn.getOutputStream();
// TO HERE for about 22 seconds

byte[] data = new byte[1024];
int len = 0;

while((len = filein.read(data)) > 0) {
ftpout.write(data,0, len);
}

// close file                   
filein .close();
ftpout.close();

В этом примере метод URLConnection.getOutputStream () зависает примерно на 22 секунды, прежде чем продолжить работу в обычном режиме, файл успешно загружен. В данном случае размер файла составляет всего 4 байта, это просто текстовый файл со словом «test» в нем, и код зависает до начала загрузки, поэтому это происходит не потому, что для загрузки файла требуется время.

Это происходит только при подключении к одному серверу, когда я пытаюсь использовать другой сервер так быстро, я могу надеяться, что это заставляет меня думать, что это проблема конфигурации сервера, и в этом случае этот вопрос больше подходит для сбоя сервера, однако, если я загружаю из FTP-клиента (в моем случае FileZilla), он работает нормально, так что может быть что-то, что я могу сделать с кодом, чтобы это исправить.

Есть идеи?

1 Ответ

1 голос
/ 14 сентября 2010

Я решил эту проблему, переключившись на использование Commons Net FTPClient, который не вызывает тех же проблем, что приводит к изменению кода на приведенный ниже.

            InputStream filein = new FileInputStream(new File("/path/to/file.txt"));

            // create url
    FTPClient ftp = new FTPClient();
    ftp.connect(host);
    ftp.login(user, pass);

    int reply = ftp.getReplyCode();
    if(!FTPReply.isPositiveCompletion(reply)) {
        ftp.disconnect();
        System.err.println("FTP server refused connection.");
        return;
    }

    OutputStream ftpout = ftp.appendFileStream("text.txt");

    // write file
    byte[] data = new byte[1024];
    int len = 0;

    while((len = filein.read(data)) > 0) {
        ftpout.write(data,0, len);
    }

    filein.close();
    ftpout.close();
    ftp.logout();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...