Melhorar desempenho ao subir arquivos para o FTP

Pessoal bom dia, implementei uma funcionalidade de upload de arquivos, onde o usuario escolhe um arquivo em sua máquina e a “joga” para o servidor ftp.
Está funcionando normal, mas o problema é que seu desempenho está muito a baixo do que eu esperava, tipo, um arquivo com 1.53 MB esta demorando quase 10 min para ser finalizado o envio. Tem alguma forma ou classe que posso trabalhar para melhorar este desempenho, ou seja, ter um ganho de velocidade?
segue abaixo código

[code]public class ServidorFTP {

private String servidor = "Francatalogos FTP";
FTPClient ftp = new FTPClient();
FTPClientConfig config = new FTPClientConfig();

public void inicia(String localArquivo, String nomePasta, String nomeArquivo) {

    ftp.configure(config);

    try {
        int responder;
        //Conecta e loga no FTP

        ftp.connect("ftp.francatalogos.com.br");
        ftp.login("francatalogos", "******");
        System.out.print(ftp.getReplyString());
        responder = ftp.getReplyCode();

        ftp.enterLocalActiveMode();
        ftp.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

        //Obtem o local do arquivo 
        FileInputStream file = new FileInputStream(localArquivo);

        //Verifica se o caminho/pasta não existe.
        //seta o caminho no qual o servidor irá trabalhar
        boolean isDirectory = ftp.changeWorkingDirectory("T&TSistemas/" + nomePasta);
        if (!isDirectory) {
            ftp.makeDirectory("T&TSistemas/" + nomePasta);
        }
        ftp.changeWorkingDirectory("T&TSistemas/" + nomePasta);

        File f = new File(localArquivo);
        nomeArquivo = f.getName();

        salvaArquivo(nomeArquivo, file);

        if (!FTPReply.isPositiveCompletion(responder)) {
            ftp.disconnect();
            JOptionPane.showMessageDialog(null, "Não foi possível conectar a " + servidor + ".");
            System.exit(1);
        }
        ftp.logout();
    } catch (IOException io) {
        io.printStackTrace();
        JOptionPane.showMessageDialog(null, "Erro ServidorFTP" + io);
    } finally {
        if (ftp.isConnected()) {
            try {
                ftp.disconnect();
                System.out.println("Desconectado !");
            } catch (IOException io) {
            }
        }
    }
}

private void salvaArquivo(String nomeArquivo, FileInputStream file) throws IOException {
    //Verifica se o arquivo foi salvo(storeFile).
    if (ftp.storeFile(nomeArquivo, file)) {
        JOptionPane.showMessageDialog(null, "Arquivo armazenado com sucesso.");
    } else {
        JOptionPane.showMessageDialog(null, "Não foi possível armazenar o arquivo.");
        ftp.logout();
        ftp.disconnect();
    }
}

}[/code]

Você poderia começar isolando onde está o problema, se no cliente ou no servidor. Fazendo a transferência ftp manualmente no mesmo servidor como fica a velocidade? E conectando seu programa a um outro servidor de teste?

Outra coisa… o nome dessa classe (ServidorFTP) não está bom, ele leva a pensar que se trata da implementação de um server. É melhor chamá-la de ClienteFTP.

gomesrod, valeu pela dica, já alterei a classe para ClienteFTP.
Bom fiz os teste e tanto em outro ftp quanto em outro cliente a demora é a mesma. Não teria uma maneira de acelerar esta tranferencia ?

Pergunta imbecil número 1. Usando um cliente FTP normal (por exemplo, o ftp.exe no Windows ou o /usr/bin/ftp do Linux) quanto tempo leva essa transferência?

Pode ser que o seu cliente esteja usando uma conexão ADSL ou cabo muito “assimétrica” (por exemplo, 10Mbits para descer e 30Kbps para subir dados). Supondo que fosse 30Kbps, por exemplo, teríamos 1530 / (30/8 ) = 400 segundos, ou quase 7 minutos.

Cara fazendo uma transferencia manual o tempo é baixo, normal coisa de segundos.
Mas deve ser devido a velocidade da conexão mesmo, apenas queria saber se existe alguma alternativa para melhorar e aumentar esse desempenho no aspecto velocidade. Valeu ai pela atenção! Obrigado

Eu não usaria de modo algum esse “enterLocalActiveMode”.
Acho que está havendo algum problema de firewall, ou coisa parecida, e o FTP Client está fazendo um “fallback” para modo passivo depois de vários minutos.
Para provar que é isso, é necessário usar um monitor de rede, como o Wireshark, e ver a comunicação entre o seu programa e o servidor FTP.
Eu usaria “enterLocalPassiveMode”; só usaria “enterLocalActiveMode” se o servidor de FTP estiver mal configurado e não aceitar o comando PASV de forma alguma.

Cara fiz essa modificação ai, utilizei o enterLocalPassiveMode, mas parece que o rendimento caiu ainda mais…

É interessante então você monitorar o consumo de rede do seu programa. Se estiver usando o Windows 7 ou 8, é fácil você saber exatamente quanto de rede está gastando seu programa.

Se a rede ficar ociosa durante um bom tempo, e só no fim desses 10 minutos ele começar a transferir os arquivos, é um problema.
Se ficar transferindo continuamente e bem devagarinho, é outra coisa.

Qual é o comportamento que ocorre?

Cara me desculpe, mas como faço este monitoramento do consumo de rede ?

Estou fazendo os testes em nosso servidor aqui da empresa, Windows Server 2008

Você não quer pedir ajuda a alguém de redes da sua empresa?

Dica: no Task Manager há uma abinha “Networking”. Veja o gráfico :slight_smile:

Opa, valeu. Bom eu analisei o gráfico, na hora da transferência o gráfico chega a quase 2,50%, mas não sei quanto isso significa na verdade…
Conversei com alguns dos desenvolvedores aqui, me disseram que talvez seja a hospedagem do servidor que estou trabalhando para subir estes arquivos, que é da LocaWeb.