Transferir arquivo usando socket

Tenho que transferir um arquivo .jar do servidor para cliente, estou usando soquetes. Estava usando ObjectOutputStream e ObjectInputStream, mas o arquivo chega corrompido… Alguem tem algum exemplo?

Os streams de objeto funcionam bem pelo que me lembre. Faz um tempo que não uso eles, mas quando usei eu cheguei a transferir arquivo sem problemas.

Você está usando fush() quando está enviando uma mensagem?

Qual é o tipo de objeto que você está tentando transferir? Aqui é um exemplo que transfere o nome do arquivo como String, depois o tamanho do arquivo e a data do arquivo como um array de bytes.

Testei com Windows 2K e java 1.4.2

O cliente:

package examples;

import java.net.Socket;
import java.net.InetAddress;
import java.io.ObjectOutputStream;
import java.io.File;
import java.io.FileInputStream;

public class FileClient {

  public static void main(String[] args) {
    File f = new File("test.jar");
    try {
      Socket socket = new Socket(InetAddress.getLocalHost(), 9191);
      ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
      System.out.println("Transferindo o arquivo: " + f.getName());
      out.writeUTF(f.getName());
      out.writeLong(f.length());
      FileInputStream in = new FileInputStream(f);
      byte[] buf = new byte[4096];
      
      while(true) {
        int len = in.read(buf);
        if(len == -1) break;
        out.write(buf, 0, len); 
      }
      out.close();
      socket.close();
      System.out.println("Pronto.");
    } catch(Exception e) {
      e.printStackTrace();
    }
  }

}

E o servidor:

package examples;

import java.net.ServerSocket;
import java.net.Socket;
import java.io.ObjectInputStream;
import java.io.FileOutputStream;

public class FileServer {
  
  public static void main(String[] args) {
    try {
      ServerSocket ss = new ServerSocket(9191);
      while(true) {
        System.out.println("Esperando por arquivos.");
        Socket socket = ss.accept();
        ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
        String fileName = in.readUTF();
        long size = in.readLong();

        System.out.println("Processando arquivo: " + fileName + " - " + size + " bytes.");
        
        FileOutputStream fos = new FileOutputStream(fileName);
        byte[] buf = new byte[4096];
        while(true) {
          int len = in.read(buf);
          if(len == -1) break;
          
          fos.write(buf, 0, len);
        }
        fos.flush();
        fos.close();
        System.out.println("Pronto.");
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }

  }

}

(desculpa meu português é peeeeeeeessimo, mas falo java fluentemente :wink:

[quote=“Sami Koivu”]Qual é o tipo de objeto que você está tentando transferir? Aqui é um exemplo que transfere o nome do arquivo como String, depois o tamanho do arquivo e a data do arquivo como um array de bytes.

E o servidor:

(desculpa meu português é peeeeeeeessimo, mas falo java fluentemente ;-)[/quote]

Sami, onde está seu problema com a língua portuguesa?
Acho que está muito melhor que muitas pessoas que postam aqui neste fórum. Parabéns!
A única coisa que está esquisita é que se diz “aqui está” em vez de “aqui é”, mas eu sei que é realmente difícil diferenciar entre o verbo “estar” e o verbo “ser”.
Às vezes diz-se “eis”, mas isso já chega a ser meio pedante, ou parecido com linguagem bíblica - “eis o mistério da fé”.

Sami Koivu, seja bem-vindo!
Quem diria,GUJ muuito além da terra-brasilis! :smiley:

Obrigado gente. :slight_smile: E diferenciar entre “estar” e “ser” é difícil mesmo. Essa tipo de coisa não existe em finlandês ou inglês.

Boa Noite.

Já aprendi a transferir um arquivo, usando o código acima. Mas como faço para saber num dado momento, quanto do arquivo já foi trasferido? Pretendo exibir alguma informação sobre a porcentagem trasferida do arquivo.

Felipe