Cara Simone..
Acredito que o arquivo possa estar sendo corrompido devido a forma como voc�
est� trabalhando com a leitura/envio do arquivo.. voc� le o arquivo
utilizando um array e o envia � Stream de sa�da...
Na leitura, o Java carrega o array com os bytes lidos do arquivo e retorna a
quantidade de bytes lidos. Na �ltima leitura, provavelmente a quantidade de
bytes lidos ser� inferior � quantidade de elementos do array e, se voc�
enviar todo o array para a stream de sa�da (neste caso, pela rede) alguns
bytes ir�o a mais, o que pode corromper o arquivo. :-)
Fl�vio Eduardo de C�rdova
Datasul S/A
Ferramentas
Sun Certified Java Programmer 1.1
"If you don�t know where you want to go, any road will take you there"
> -----Original Message-----
> From: Simone Freire [SMTP:[EMAIL PROTECTED]]
> Sent: Tuesday, February 02, 1999 9:55 AM
> To: [EMAIL PROTECTED]
> Subject: Transferencia de arquivos via Socket e BufferedInputStream
>
> Srs e Sras, Saudacoes.
> Estive afastado, de ferias, por uns tempos, mas
> agora estou de volta, e trouxe um pequeno problema.
> Estou finalizando dois softwares, um cliente e um
> servidor de chat, em java, e estou iniciando implementacao da rotina
> de transferencia de arquivos,
> cliente a cliente, via Socket e ServerSocket.
>
> Na minha rotina de teste, defino o arquivo com File e
> o abro para leitura com FileInputStream, para leitura byte a byte,
> repassando os bytes lidos para Socket.getOutputStream(), via
> BufferedOutputStream. No outro lado da conexao, capturo os bytes com
> Socket.getInputStream(), via BufferedInputStream. Funciona beleza
> quando nao estou buferizando a leitura do arquivo no cliente de
> origem, ou seja, leio um byte,transmito um byte, e assim
> sucessivamente, so que fica lento, apesar de nao ocorrer degradacao
> dos dados.
>
> Para encurtar o tempo de leitura, envolvi o FileInputStream, na
> leitura do arquivo de origem, com
> BufferedInputStream, e usei o metodo
> read(byte[] b, int offset, int count) de BufferedInputStream para ler
> os bytes, definindo b como um buffer de 100 bytes, offset em 0 e count
> em 100, como em read(b,0,100). Ficou super rapido. So que degradou o
> arquivo, ou seja, o arquivo de destino sempre fica maior que o de
> origem. Como exemplo, defini a origem como sendo o Notepad.exe. Apos
> gerado o destino, este nao executa de forma alguma, pois esta
> corrompido. Analisei o codigo e reduzi o buffer para 4 bytes. Funciona
> sem problema. Aumentei o buffer para 5 bytes. Come�a a corromper o
> arquivo. Nao consegui entender. Sera algum bug? Segue abaixo os
> codigos dos
> arquivos Main.java e Transf.java, cliente e servidor de sockets,
> respectivamente. Em Main.java tem umas quatro linhas desabilitadas,
> relativas a um gauge de progresso, que desabilitei pois a classe ainda
> nao esta pronta.
>
> Para testar Main.class e Transf.class, colocar os dois arquivos num
> mesmo diretorio junto com uma copia do notepad.exe(que so serve para
> teste, pode ser outro arquivo, desde que seja alterado o parametro de
> File em
> Main.java). Executar Transf.class, com o comando
> java Transf e depois executar Main.class, que eh so
> uma janela de teste,com um botao que realiza a conexao e inicia a
> transferencia, tudo bem primario, pois eh so teste.
>
> Desculpem o "jornal" acima, mas procurei descrever bem o problema.
> Conto com a ajuda de voces.
> Andre.
>
> Codigo do Main.java
> -------------------
>
> import java.awt.*;
> import java.io.*;
> import java.awt.event.*;
> import java.net.*;
>
> public class Main extends Frame implements ActionListener {
> Gauge g;
> Label l1;
> public Main() {
> super.setTitle("Teste de transferencia de arquivo");
> setSize(300,300);
> setLayout(new FlowLayout(FlowLayout.CENTER));
> Button b1=new Button("Transfere");
> add(b1);
> //g=new Gauge();
> //add(g);
> l1=new Label(" ");
> add(l1);
> b1.addActionListener(this);
> Dimension d=getToolkit().getScreenSize();
> setLocation((d.width-getSize().width)/2,
> (d.height-getSize().height)/2);
> setVisible(true);
> }
>
> public void actionPerformed(ActionEvent evt) {
> try {
> Socket s=new Socket("127.0.0.1",5500);
> File f=new File("notepad.exe");
> //g.setMaxValue(f.length());
> FileInputStream fi=new FileInputStream(f);
> BufferedInputStream bi=new BufferedInputStream(fi);
> int c;
> int nrBytes=0;
> byte[] b=new byte[4];
> BufferedOutputStream bOut=
> new
> BufferedOutputStream(s.getOutputStream());
> while ((c=bi.read(b,0,4))!=-1) {
> //System.out.println(c);
> bOut.write(b);
> bOut.flush();
> nrBytes+=c;
>
> l1.setText(Integer.toString(nrBytes*100/(int)f.length()));
> //g.setPosition(nrBytes);
>
>
>
> }
> bOut.close();
> System.out.println("gravou");
>
>
>
> }
> catch (IOException e) {
> System.out.println("Houve erro de conexao");
> }
> }
>
> public static void main(String[] args) {
> new Main();
> }
> }
>
>
>
> Codigo do Transf.java
> =====================
>
> import java.net.*;
> import java.io.*;
>
> public class Transf {
> Socket s;
> public Transf() {
> try {
> ServerSocket ss=new ServerSocket(5500);
> s=ss.accept();
> File f=new File("saida.exe");
> FileOutputStream fOut=
> new FileOutputStream(f);
> BufferedInputStream bi=new BufferedInputStream(
> s.getInputStream());
> int c;
> byte[] b=new byte[4];
>
> while ((c=bi.read(b,0,4))!=-1) {
>
> fOut.write(b);
> }
> }
> catch (IOException e) {
> fecha();
> }
> }
>
> public void fecha() {
> try {
> s.close();
> }
> catch (IOException e) {
> }
> }
>
> public static void main(String[] args) {
> new Transf();
>
>
> }
> }
>
>
>
>
>
>
>
>
>
>
>
> _________________________________________________________
> DO YOU YAHOO!?
> Get your free @yahoo.com address at http://mail.yahoo.com
>
> * Para nao receber mais e-mails da lista, acesse
> <http://www.sun.com.br:8080/guest/RemoteAvailableLists>, coloque seu
> e-mail, escolha a lista <[EMAIL PROTECTED]> e de um <submit>.
* Para nao receber mais e-mails da lista, acesse
<http://www.sun.com.br:8080/guest/RemoteAvailableLists>, coloque seu e-mail, escolha a
lista <[EMAIL PROTECTED]> e de um <submit>.