Problemas Socket envio de Arquivos no Linux

5 respostas
sethbra

Opa pessoal tudo bom com vocês?
Bem vou falar logo o problema que deu aqui.

Teste um código de envio de arquivos via socket no Windows e funciona. O mesmo código de envio de arquivos no Linux simplesmente aumenta o tamanho do arquivo.

O código para envio é este

import java.net.*;

import java.io.*;



public class ServerMe extends Thread {

ServerSocket servidor = null;

Socket cliente = null;

private final int port = 9999;

private final String filename = "/home/lasol05/Desktop/Ola/Informacao.java";

private void IniciaServer(){

try {

      servidor = new ServerSocket(port);

    }catch(Exception e)

     {  System.out.println(e);

         System.exit(0);

     }

        while (true) {

            try {

                cliente = servidor.accept();

                FileInputStream fin = new FileInputStream (filename);

                DataOutputStream out = new DataOutputStream (cliente.getOutputStream());

                DataInputStream in = new DataInputStream (fin);

                byte buffer[] = new byte[512];

                while (in.read(buffer) != -1)

                   {out.write(buffer,0,buffer.length);

                    out.flush();

                   }

            }catch (Exception e){

                System.out.println(e);

                System.exit(0);

            } finally {

                try {

                    cliente.close();

                }catch (Exception e) {

                    System.exit(0);

                }

            }

        }

    }

    public void run(){

        IniciaServer();

    }

    public static void main (String args [])

{

   ServerMe servidor = new ServerMe();

   servidor.start();

}



}

e o do cliente é este

import java.net.*;

import java.io.*;



public class ClienteMe  {

Socket cliente = null;

String filename = "c:/testes/teste_novo.rar";

void IniciaCliente ()

{  try

   {

    cliente = new Socket("localhost",999);

    DataInputStream in = new DataInputStream(cliente.getInputStream());

    FileOutputStream fout = new FileOutputStream(filename);

    byte[] buffer = new byte[512];

    int leitura = in.read(buffer);

    while(leitura != -1) {

      if(leitura != -2) {

        fout.write(buffer,0,leitura);

      }

      leitura = in.read(buffer);

    }

    fout.close();

    in.close();

    cliente.close();

   }

   catch(Exception e)

     {  System.out.println(e);

         System.exit(0);

     }

}

public static void main (String args [])

{

  ClienteMe cliente = new ClienteMe();

  try

    { cliente.IniciaCliente();}

  catch(Exception e)

    {  System.out.println(e);

      System.exit(0);

    }



}



}

5 Respostas

A

Tente instanciar seu FileOutputStream forçando para que não quer fazer append.
No seu cliente alterar a linha onde você instancia o FileOutputStream para:

FileOutputStream fout = new FileOutputStream(filename,false);

Quando você não passa esse parâmetro ele usa o padrão da VM ou do SO (agora não lembro), mas acho que deve ser esse seu problema.

Isso fará com que ele irá iniciar a escrita do arquivo do zero.
Apenas vale lembrar que você irá sobrescrever o arquivo, porque não gera o arquivo sequencial ou algo assim?

Ats,
Endrigo Antonini

sethbra

Olha antonini mesmo colocando false no

FileOutputStream(filename,false)

não funcionou e o arquivo continua aumentado de tamanho
mas valeu por ter respondido

sethbra

Mais alguém!

T
while (in.read(buffer) != -1)  
   
                    {out.write(buffer,0,buffer.length);  
   
                     out.flush();  
   
                    }

Isto vai aumentar o tamanho do seu arquivo mesmo. Ele só não seria aumentado de tamanho se tivesse um tamanho que fosse um múltiplo de 512 bytes.

Conselho: pegue o retorno de in.read, que é a quantidade de bytes lidos, e passe-o para out.write.

sethbra

Muito obrigado!!!
o código funcionou blz
abraço

Criado 11 de agosto de 2008
Ultima resposta 13 de ago. de 2008
Respostas 5
Participantes 3