Enviar Arquivo via Socket

7 respostas
I

Galera, alguém pode me dizer como eu faço para pegar um arquivo genérico e passar ele via Socket e por ele passar os seus bytes para o outro lado…

Eu vi que as classes que herdam InputStream possuem o método avaliable que retorna um int, mas eu queria mesmo é um método para retornar um array de bytes e assim colocar dentro de um looping e passar via socket…

Se alguém tiver outra sugestão para resolver o problema, ok :smiley:

7 Respostas

E

Olá ivandasilva!
Eu ainda desconheço um método que retorne um array de bytes.

mas vc pode fazer assim:
Usar a classe FileInputStream.read(byte[] b) para ler os bytes e FileOutStream.read(byte[] b) para escrever os bytes.
O método read(byte[] b) retorna um número inteiro para informar a quantidade de bytes lidos. Quando o arquivo termina, ele retorna -1.

Esse array de bytes do método read() é o array que vai ser preenchido com os bytes lidos.

http://battisti.wordpress.com/2008/06/07/socket-em-java/
http://javafree.uol.com.br/artigo/2879/Programando-com-sockets-em-java-parte-01.html
http://java.sun.com/j2se/1.4.2/docs/api/index.html

Espero ter ajudado!

I

eliangela,

Eu ainda não vi os links que você postou, pode ter certeza que eu vou ver, mas a minha dúvida é como eu vou pegar os bytes do arquivo para transferência, porque eu posso definir um array de bytes mas como a subclasse de InputStream vai saber de qual arquivo que é.Por exemplo se é um PDF ou um TXT...


Não sei se entendeu minha dúvida mas é isto.

Muito Obrigado!

I

Problema solucionado…

Na verdade o problema nem era o Socket eu estava confuso quanto o uso dos métodos read(byte[] b) e write(byte[] b)…
Bom para efetuar a leitura(sem uso de socket) eu fiz assim…

File file = new File("C:/Sun/AppServer/License_Notice_Translated.pdf");
        FileInputStream fis = new FileInputStream(file);
        int size = fis.available();
        byte[] up = new byte[size];
        fis.read(up);

        file = new File("c:/users/irodrigues/Desktop/arquivo.pdf");
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(up);
V

É, na verdade, pouco importa para a classe se é PDF ou txt. Os dois serão feitos de bytes…

Mas seria bom você dar uma olhada nesse exemplo do entaglement:
http://www.guj.com.br/posts/list/144568.java#779294

A

Vc deve usar o modelo do evangeliment por vc não tem garantia que todos os bytes serão lidos ao mesmo tempo no cliente, logo vc tem que ir montando o seu arquivo com um pooling, como ele demostrou.

I

ovelha, eu não consegui enchergar o pooling, no exemplo dele ele define um número mágico 1400. Na verdade eu não vi o pooling que você falou e não consegui enchergar o perigo de enviar via socket um arquivo.

A

Não existe perigo em mandar arquivo via socket, o perigo é programar o socket de forma errada.

Até ler um arquivo do disco da forma que vc implementou não é a adequada, quem dira pegar um arquivo de um socket.

Quando vc faz um InputStream.read, vc não tem a garantia que todos os bytes serão lidos naquele momento, nem mesmo a garantia que seu numero magico será o numero de bytes lidos.

Pode ser que na primeira InputStream.read venham apenas 500b, por isso nosso amigo entanglement resaltou a importancia de pegar o numero de bytes recebidos.

Em outras palavras, o pooling (for) vai garantir que seu arquivo venha inteiro (pode ser que vc tenha que dar 20 InputStream.read), e pegar o numero de bytes recebidos garante que vc não vai escrever lixo no seu arquivo. (já que pode vir apenas 500 unidades e todo o resto do array seria lixo)

Isso vale tanto para sockets quanto para IO comum.

Criado 18 de dezembro de 2009
Ultima resposta 18 de dez. de 2009
Respostas 7
Participantes 4