[RESOLVIDO] Fazer download e executar no final

5 respostas Resolvido
java
R

Galera, eu quero fazer um sistema de atualização.

Sabe quando a gente baixa uma atualização de software e ele já baixa no próprio e no final já executa? Então, eu queria fazer isso.

Essa é minha classe de servidor, eu pesquisei sobre Socket, mas eu não tô conseguindo fazer o envio por FTP

Classe Cliente:

public class Cliente {

    public static void main(String[] args) throws UnknownHostException, IOException {
            System.out.println("Aguardando Servidor...");
            
            Socket cliente = new Socket("127.0.0.1", 6563);
            
            ObjectOutputStream out = new ObjectOutputStream(cliente.getOutputStream());
            
            FileInputStream arquivo = new FileInputStream ("C:\\Users\\abner\\Desktop\\Imperium\\setup.exe");
            
            byte [] buf = new byte [4096];
            
            while(true){
                int len = arquivo.read(buf);
                if(len == -1) break;
                out.write(buf, 0, len);
            }
    }
}

Classe Servidor:

public class Servidor {

        public static void main(String[] args) throws UnknownHostException, IOException {
            System.out.println("Aguadando Cliente...");
            ServerSocket servidor = new ServerSocket(6563);
            
            Socket sv = servidor.accept();

            ObjectInputStream out = new ObjectInputStream(sv.getInputStream());
            FileOutputStream file = new FileOutputStream("C:\\Users\\abner\\Desktop\\Imperium\\teste\\setup.exe");

            Runtime.getRuntime().exec("C:\\Imperium\\Funcionarios.exe"); //executa no final da instalação

            byte[] buf = new byte[4096];

            while (true) {
                int len = out.read(buf);
                if (len == -1) break;           
                file.write(buf, 0, len);
            }
        }

    }

5 Respostas

S
Solucao aceita

Acho que você se confundiu um pouco, criou ObjectOutputStream e ObjectInputStream desnecessários além de tentar executar o arquivo no Servidor.

O Servidor não executa nada no Cliente, é o Cliente quem tem que executar o arquivo após recebê-lo do Servidor.

Dei uma refatorada no seu código, veja.

Classe utilitária para copiar bytes de um InputStream para um OutputStream:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class IO {

    public static void copy(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[8192];
        for (int read = -1; (read = in.read(buffer)) != -1; out.write(buffer, 0, read)) {/* não precisa fazer nada no corpo do for */}
        out.flush();
    }

    private IO() {}
}

Classe Servidor:

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Servidor {

    public static void main(String[] args) {
        try {
            Servidor servidor = new Servidor();
            servidor.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        } finally {
            System.exit(0);
        }
    }

    public void executar() throws Exception {

        String caminhoArquivo = "C:\\Users\\abner\\Desktop\\Imperium\\teste\\setup.exe";
        ServerSocket serverSocket = new ServerSocket(6563);
        while (true) {
            System.out.println("Aguadando Cliente...");
            Socket socket = serverSocket.accept();

            InputStream entrada = new FileInputStream(caminhoArquivo);
            OutputStream saida = socket.getOutputStream();

            // envia o arquivo do servidor para o cliente
            IO.copy(entrada, saida);

            entrada.close();
            socket.close();
        }
    }
}

Classe Cliente:

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Cliente {

    public static void main(String[] args) {
        try {
            Cliente cliente = new Cliente();
            cliente.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        } finally {
            System.exit(0);
        }
    }

    public void executar() throws Exception {
        String caminhoArquivo = "C:\\Users\\abner\\Desktop\\Imperium\\setup.exe";

        System.out.println("Conectando com Servidor...");
        Socket socket = new Socket("127.0.0.1", 6563);

        InputStream entrada = socket.getInputStream();
        OutputStream saida = new FileOutputStream(caminhoArquivo);

        // receber arquivo do servidor
        IO.copy(entrada, saida);
        saida.close();
        socket.close();

        // executar arquivo recebido
        Process processo = Runtime.getRuntime().exec(caminhoArquivo);
        int status = processo.waitFor();
        System.out.println("Arquivo executado! Status: " + status);
    }
}

Você pode até ir além e, por exemplo, enviar o status da execução de volta ao servidor, assim o servidor pode fazer um log de quais clientes instalaram com sucesso.

R

Ahhhhhhh, eu tava confundindo isso de cliente e servidor. Tava pensando que a maquina que estava instalada seria o servidor, e eu o cliente, e eu enviaria.

Obrigado pela explicação e pela ajuda, Staroski, funcionou perfeitamente, obrigado!

R

@staroski, só uma dúvida, se eu quiser fazer isso via FTP ou URL, eu nem preciso de servidor, certo?

R

Consegui, mas com outro jeito, já posto a solução

R
public void atualiza() {
    new Thread() {
        @Override
        public void run() {
            System.out.println("Realizando conexão com o servidor");

            String servidor = "ftp.seusite.com"; //Endereço do seu FTP.
            int porta = 21; //FTP usa a porta 21 como padrão.
            String usuario = "usuario"; //Seu usuário no servidor.
            String senha = "senha."; //Sua senha no servidor.

            FTPClient ftpClient = new FTPClient();
            try {
                ftpClient.connect(servidor, porta); //Faz a checagem 1.
                ftpClient.login(usuario, senha); //Faz a checagem 2.

                System.out.println("Conectado com sucesso ao servidor!");
                ftpClient.enterLocalPassiveMode(); //Entra no modo passivo.            
                System.out.println("Entramos no modo passivo!");

                ftpClient.setFileType(FTP.BINARY_FILE_TYPE); //AQUI A DESGRAÇA ACONTECE, se você quer pegar um .exe, deixe assim.
                System.out.println("Configurando parâmetros!");

                System.out.println("Localizando arquivo para realizar o download");
                String arquivoRemoto = "/suapasta/seuarquivo.extensão"; //Aqui vc seta a localização do arquivo lá no servidor FTP.
                System.out.println("Arquivo localizado. Baixando...");

                System.out.println("Salvando no seu diretório local");
                File arquivoLocal = new File("C:\\Pasta\\Arquivo.extensão"); //Aqui vc seta onde vc quer salvar o arquivo.
                System.out.println("Arquivo Salvo.");

                OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(arquivoLocal));
                boolean sucesso = ftpClient.retrieveFile(arquivoRemoto, outputStream);
                outputStream.close();

                if (sucesso) { //Se o seu download tiver sucesso, vai dar uma mensagem no terminal
                    System.out.println("O seu arquivo foi baixado com sucesso!");

                    System.out.println("Abrindo Arquivo... Por favor, aguarde!");
                    Process processo = Runtime.getRuntime().exec("C:\\Pasta\\Arquivo.extensão"); //Aqui vc coloca a mesma pasta que vc salvou, pq aí ele baixa e já executa
                    int status = processo.waitFor();
                    System.exit(0);
                    System.out.println("Instalador executado! Status: " + status);
                }

            } catch (IOException ex) { //Se o seu download der erro, vai dar uma mensagem no terminal tbm
                System.out.println("Erro no download de arquivos do servidor FTP : " + ex.getMessage());
            } catch (InterruptedException ex) {
                Logger.getLogger(ConectaFTP.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    if (ftpClient.isConnected()) {
                        ftpClient.logout();
                        ftpClient.disconnect();
                    }
                } catch (IOException ex) {
                }
            }
        }
    }.start();
}
Criado 30 de maio de 2018
Ultima resposta 1 de jun. de 2018
Respostas 5
Participantes 2