• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Hipnoted

[Ajuda] Enviar ficheiros em Java

15 mensagens neste tópico

É 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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pá eu nunca trabalhei com RMI mas penso que se o file nao for muito grande podias mandar o servido ler o file e envia para o client em forma de stream e depois caso fazer o cliente criar esse file de forma identica. Não tou a ver outra forma :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hum... esse é um problema interessante de RMI... O ficheiro tem mesmo de ser enviado dessa forma? Não podes enviar o ficheiro através de um socket?

Já agora que tipo de problemas estás a ter?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema nesse caso é o mesmo, embora arrays sejam objectos em Java, não são serializáveis logo não poderão ser passados como argumentos de um método RMI.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :D

/ing

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
O futuro são os webservices.... ou não, quem sabe

Futuro não, presente :(

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

yep :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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... :D

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. :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora