Melhorar desempenho ao subir arquivos para o FTP

11 respostas
Rafael_Ferraro

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

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();
        }
    }
}

11 Respostas

gomesrod

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.

Rafael_Ferraro

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 ?

E

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.

Rafael_Ferraro

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

E

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.

Rafael_Ferraro

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

E

É 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?

Rafael_Ferraro

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

Rafael_Ferraro

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

E

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:

Rafael_Ferraro

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.

Criado 18 de março de 2013
Ultima resposta 18 de mar. de 2013
Respostas 11
Participantes 3