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
[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!
Obrigado gente. 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