Jump to content

Enviar ficheiros em Java


Hipnoted
 Share

Recommended Posts

É assim, tou num trabalho em Java RMI que me dava geito enviar um ficheiro do servidor para o cliente. Não estou a falar em envio de Strings mas sim de um ficheiro mesmo.

Basicamente o cliente chama um método X do tipo public File receberFicheiro(). Mas a minha dúvida está em como posso ler o ficheiro recebido já que o ficheiro tem um pathname especifico do servidor e não sei lidar com isso no cliente.

Já perdi uma tarde por causa disto mas não consegui resolver. Agradeço a quem me ajudar...

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Link to comment
Share on other sites

Estive a pensar no teu problema e, se não me engano, a classe File define um descritor de ficheiros, e esse tipo de dados não pode ser passado através do RMI. Apesar da classe ser serializável, esse não é o único requisíto. Objectos como Threads e descritores de ficheiros não são passíveis de enviar usando RMI uma vez que não fazem sentido na máquina que recebe o parâmetro.

A solução terá mesmo de ser criar um socket de comunicação e enviar o ficheiro por esse socket.

Posso estar engando mas penso que não conseguirás transferir o ficheiro como um objecto RMI.

Link to comment
Share on other sites

Tenta algo do género .

No Servidor ...

...
byte[] bt;
...........

public byte[] sendFile(File fname){
try{
      .......................
      FileInputStream is=new FileInputStream(fname); 
      byte[] b=new byte[(int)fname.length()];
      is.read(b);
      bt=b; 
     return bt;
}
catch (Exception e){}
    return bt;
}

public byte[] retrieveFile()
{
  return bt;
}

No Cliente

public void sendFile(File f){
try {
            ChatServer c=(ChatServer)Naming.lookup("rmi://"+dwin.host+"/ChatServer");
            byte[] v=c.retrieveFile();
            RandomAccessFile raf=new RandomAccessFile(f,"rw");
            raf.write(v); 
}
catch (Exception e)
{}
}

para ficheiros grandes usa sockets.

/ing

I used to have a life ... but i bought a programmable machine in 1982 ...

Link to comment
Share on other sites

Uma opção poderá ser implementares tu os métodos de serialização,

private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;

Mas não sei até que ponto te será útil ou fácil de implementar.

Link to comment
Share on other sites

Sim mas dessa forma não estamos a usar RMI, por isso é que preguntei se tem mesmo de ser por RMI.

Sem ser por RMI é fácil mas se for necessário usar o mecanismo então vai exigir mais trabalho.

E já agora, implementar serializações não é nenhum bicho de sete cabeças, é até bastante fácil 😞

Link to comment
Share on other sites

peço desculpa. não fui esclarecedor.

1- http://xstream.codehaus.org/  wrapper para simplificar serializações de objectos, logo não é necessário implementar serialização, basta usar o Xstream.

2-usar o rmi.

** offtopic **

Percebo que seja pra um trabalho da faculdade... mas o rmi tá morto na minha opinião 😞

/ing

I used to have a life ... but i bought a programmable machine in 1982 ...

Link to comment
Share on other sites

Agora sou eu que não percebo...

O Xstrem permite facilitar as serializações mas como é que o usas com o mecanismo RMI?

Offtopic...

Tão morto como o CORBA, mas serviu de base para muito do que se faz actualmente, mesmo assim ainda gosto de usar e ainda encontro bastantes utilizações onde simplesmente é mais fácil e rápido, dado os meus poucos conhecimentos noutros mecanismos claro, implementar computação distribuída.

Link to comment
Share on other sites

Agora sou eu que não percebo...

O Xstrem permite facilitar as serializações mas como é que o usas com o mecanismo RMI?

p.ex. serializas um File para uma string e passas a string como argumento na tua função em vez de um array de bytes.

O Corba tmb tá morto 😞 simplesmente sofre do mesmo mal de muitas tecnologias defendidas por alguns envagelistas ... negam-se a evoluir 😄

/ing

I used to have a life ... but i bought a programmable machine in 1982 ...

Link to comment
Share on other sites

Ok, percebi, mas talvez seja melhor dizer, serializamos o conteúdo do File, uma vez que File é um descritor de ficheiro, não faz sentido do lado do cliente, e passamos o conteúdo por parâmetro, mas assim é melhor usarmos sockets, senão estamos a sobrecarregar o mecanismo RMI.

O futuro são os webservices.... ou não, quem sabe 😞

Bem, espero que as ideias aqui dadas sirvam para alguma coisa, de preferência para resolver o problema 😄

Link to comment
Share on other sites

Obrigado a todos pelas respostas mas acho que vou optar por enviar strings, já tá feito e tenho de entregar o trabalho até dia 26. E nos dias anteriores (25) não devo fazer nada... 😄

Quanto à opção de receber byte [] acho que vai dar tudo ao mesmo que receber strings.

Quanto à questão de usar o socket, em RMI isso é totalmente transparente para mim e quando trabalhei com sockets o que enviava eram strings.

Mas obrigado à mesma. 😞

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.