Transferência de Arquivo

5 respostas
pitiko

Boa tarde,

Estou usando socket para fazer transferência de arquivo entre cliente/servidor.. Eu consigo pegar o arquivo do servidor para o cliente, mas não consigo mandar o arquivo do cliente para o servidor. O código que eu estou usando está abaixo:

public void cliente(String fName) throws FileNotFoundException, UnknownHostException, IOException {

        File f = new File("/home/andre/" + fName);
        FileInputStream in = new FileInputStream(f);

        Socket socket = new Socket("localhost", 5678);
        OutputStream out = socket.getOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(out);
        BufferedWriter writer = new BufferedWriter(osw);
        writer.write(f.getName() + "\n");
        writer.flush();
        int tamanho = 4096; // buffer de 4KB    
        byte[] buffer = new byte[tamanho];
        int len;
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
    }

Agora abaixo eu crio o arquivo que eu quero enviar para o servidor:

public void salvarOriginal() throws IOException {
        File arquivo_cache = new File(arquivo_server);
        String hello = texto.getText();
        FileWriter fw = new FileWriter(pasta_principal.toString() + "/" + arquivo_cache);
        fw.write(hello);
        fw.close();
    }

E o meu servidor está assim:

public class Server extends Thread {

    protected Socket s;

    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(5678);
        System.out.println("Capivara Server [start]");
        while (true) {
            Socket cliente = ss.accept();
            Server c = new Server(cliente);
            c.start();
        }
    }

    public Server(Socket s) {
        System.out.println("New client in Capivara!");
        this.s = s;
    }

    public void run() {
        OutputStream out = null;
        InputStream in = null;
        File arquivo = null;

        try {

            BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String caminho = input.readLine();
            arquivo = new File(caminho);

            in = new FileInputStream(arquivo);
            out = s.getOutputStream();

            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            System.out.println("Transfer File " + arquivo + " success!");
            s.close();
        } catch (IOException e) {
        } finally {
            try {
                in.close();
            } catch (IOException ex) {
            }
        }
    }
}

Obrigado.

5 Respostas

E

Eu não usaria um socket simples para fazer transferência de arquivos. Em vez disso, instalaria algo como o scp, que permite transferência criptografada e compactada de arquivos com várias otimizações e recursos de segurança.

M

Bom, mas você poderia criar uma critografia sua para fazer essa trasferênca no seu protocolo, assim fica bem seguro.

Boa sorte

zanata

@pitiko, sem entrar em questões relacionadas a boas práticas ou segurança. Bem na correria e só para você ver o seu código funcionando.

No código do seu “Server” você precisa “criar” o arquivo no “disco” antes de direcionar o fluxo para dentro dele.

Entre as linhas 29 e 31, você deve acrescentar algo semelhante ao código abaixo (por favor, faça melhor do que isso):

if (!arquivo.exists()) {
	arquivo.createNewFile();
}

[]s

pitiko

Obrigado pelas repostas…

Mas qual seria o comando para enviar o arquivo para o servidor, seria:

cliente(“arquivo.txt”);

Obrigado.

zanata

Olá @pitiko,

Então, isso depende do seu código. Como disse antes, não vou entrar no mérito de qualidade ou de boas práticas, pois talvez você esteja no início e apenas fuçando e eu não quero encher o seu saco com isso. Vou apenas comentar sobre o código enviado para que você consiga utilizá-lo.

Na primeira listagem temos o método “cliente”, que deve estar fazendo o papel de enviar o conteúdo do arquivo para o servidor. Provavelmente esse método deve estar em uma classe separada, que vou chamar de “Enviador” (não estou me preocupando com nomenclatura aqui).

Nessa classe “Enviador”, você deve ter um método “main” e lá criar uma instância de “Enviador”. Correto? Ficaria mais ou menos assim:

public static void main(String[] args) {

    Enviador e = new Enviador();
	
    e.cliente("arquivo.txt");

}

Seria isso, mas você tem que dar uma geral aí, pois no código do teu “Server” não vi nada para criar o nome do arquivo de acordo com o conteúdo enviado. Então, será sempre o mesmo nome de arquivo no lado Server. Essas são exceções comuns de ocorrer e é claro que tem bibliotecas com muitas coisas prontas que te ajudam a cuidar disso, mas como você está praticando, é bom fazer no modo “artesanal” mesmo.

Exemplo de tratamentos: Você precisa fazer a “criação do arquivo” no disco caso ele não exista, precisa tratar a ocorrência de “já existência” do arquivo no disco, etc.

Acho que seria melhor você exercitar mais um pouco. No próprio GUJ tem coisas bacanas para isso.

Dê uma olhada nesses artigos e pratique. Ok?

Aprendendo a manipular arquivos
http://www.guj.com.br/articles/13

Usando Sockets
http://www.guj.com.br/articles/126

De qualquer forma, você está indo pelo caminho certo. Só errando é que se aprende alguma coisa.

[]s

Criado 23 de novembro de 2011
Ultima resposta 24 de nov. de 2011
Respostas 5
Participantes 4