RMI - problemaço

Olá pessoal,
Tenho o seguinte:
Um servidor e dois clientes. Só que em vez de só o cliente que enxerga o servidor através do RMI, queria que o Servidor tb enxergasse o cliente.
Tentei fazer isso mais dá erro.
Estou usando: serv = (Server) Naming.lookup(“rmi://127.0.0.1/ServerService”);
Para enxergar o Servidor.
E estava usando a mesma coisa para que o servidor visse o cliente.
Criei então uma classe que controla chamada CONTROLADOR. Aí o servidor enxerga a classe CONTROLADOR e ela acessa o cliente simplesmente chamando a classe cliente.
BLZ, até aí, pois tem um momento que o servidor fica preso nessa classe CONTROLADOR.
Muito estranho…

Alguém tem um exemplo clássico onde ambos se enxergam e enviam mesagem? Tipo um chat em RMI.

Agradeço. :slight_smile:

Em que momento? O que é “preso”?

Que tal usar algo mais facinho?
http://www.retrogui.com/cgi-bin/wiki_dualrpcserver.pl/DualRpcServer

Isso é feito por meio de callbacks em RMI.

Este artigo fala de RMI: http://www.guj.com.br/java.article.get.print.chain?article.id=37

Mas na época nem falei de callbacks com RMI. Para isso, olhe aqui: http://www.javaworld.com/javaworld/javaqa/1999-04/05-rmicallback.html

[quote=LIPE]Que tal usar algo mais facinho?
http://www.retrogui.com/cgi-bin/wiki_dualrpcserver.pl/DualRpcServer[/quote]

LIPE, vc criou o DualRPC ou ele salvou sua vida?

Salvou minha vida :smiley:

Vamos fazer terapia em grupo. Conte o que aconteceu com você. Fale mais de sua experiência. Nâo tenha medo nem vergonha.

Olá, meu nome é Filipe.

Prometi para um amigo que entregaria um IM relativamente simples para ele em uma semana. Com a ajuda dos dois poderes, Thinlet e DualRpc, foi possível. DualRpc é tão ridiculamente fácil que dá raiva. Amem o DualRpc.

Obrigado.

Valeu galera.
Lipe, é uma parada interessante, mais como o projeto está no fim, e no momento estou apertado com mais projetos da facult. para resolver, aí fica difícil aprender assim.

E Daniel, aquele primeiro link eu já tinha visto e já havia implementado, faltava o inverso, o Servidor enxergar o Cliente, ou seja, criar uma interface para o Cliente…
E já tentei como eu disse, funciona com o Cliente exergando(serv = (Server) Naming.lookup(“rmi://127.0.0.1/ServerService”); ) o Servidor mas, o Servidor enxergando (clie = (Cliente) Naming.lookup(“rmi://127.0.0.1/ClienteService”); ), o cliente dá erro quando faço os dois juntos.

Entenderam.
Mais mesmo assim valeu pessoal.

Que erro cara?

O erro é esse:

java.rmi.MarshalException: error marshalling arguments; nested exception is: 
	java.net.SocketException: Software caused connection abort: socket write error

Isso acontence quando eu crio uma interface para o cliente e para o servidor.

Quando eu crio uma interface para um controlador do Cliente(onde tem minha interface), o problema é outro, o software trava. e quando eu fecho o servidor, o cliente volta.

Maior doidera.

Explicando melhor:
CLIENTE - enxergo o servidor e faço a requisição
CONTROLADOR - onde eu instancio a classe cliente e recebo a requisição vinda do servidor.
SERVIDOR.

Pra ser mais exato, o erro ocorre quando eu faço a requisição ao servidor:

serv = (Server) Naming.lookup("rmi://127.0.0.1/ServerService");
serv.insertBotJog(this.colBotProprio.botao, 1);

Esse erro acontece quando eu tenho apenas:
CLIENTE:

clie = (Cliente) UnicastRemoteObject.exportObject(this, 0);
Naming.rebind("ClienteService", clie);

SERVIDOR:

serv = (Server) UnicastRemoteObject.exportObject(this, 0);
Naming.rebind("ServerService", serv);

E os dois se enxergam da mesma maneira:
SERVER:

clie = (Cliente) Naming.lookup("rmi://127.0.0.1/ClienteService");

CLIENTE:

serv = (Server) Naming.lookup("rmi://127.0.0.1/ServerService");

Será que é a maneira como eu enxergo ambos, como faço para mudar isso?Se for mesmo o problema.

O segundo link deve te resolver o problema.

Olá Galera,
Dei uma olhada no Link daniel e estava implementando igual aquilo, o erro está no objeto Serializable, mas já implementei o objeto que estou passando como Serializable, mas nada funciona, alguém tem mais idéia?
Eu poderia colocar o código, mais são mais de 1000 linhas, aí fica complicado!

Obrigado, :frowning:

Todos os atributos das classes são serializáveis?

Ta aí, outro problema, isso eu não sei.

Olha eu coloquei:

public class ClienteImpl extends JFrame implements Cliente, Serializable

Aí o que acontece, tem um atributo que tento passar e não vai, o resto consigo acessar os arquivos do Servidor e tudo mais, mais passar não consigo.

Como faço para deixar todos os atributos Serializable?

Abraços

Galera, consegui
O erro era justamente o Serializable. Só que estava pegando um atributo de uma outra classe, e esta mesmo estando Serializable não permitia.
Aí o que foi que eu fiz, peguei os atributos da classe que eu havia criado e colocado na classe Cliente, e essa classe é Serializable, e permitiu sem nenhum problema que eu enviasse.

Quero agradecer a todos, foi show.

Abraços pessoal. E até logo.

Se o tipo dos atributos for wrapper, date ou String nao precisa fazer nada. Se for um tipo criado por vc, faca-o Serializable.

Pq nao quebra o problema em partes?

Faca um simples programa q faz comunicacao RMI em duas vias… se Der certo vc tentar ver o erro em outro lugar.

Lipe, o código é fechado???Eu preciso fazer algo parecido(a diferença é que eu vou criptografar a msg), mas nunca mexi nem com thinlet nem com o DualRPc.Pode disponibilizar trechos do código? :?:

Posso sim, mas já te adianto que você não vai entender merda nenhuma, visto que o fiz em 1 semana :smiley:

Thinlet é muito baba.
Qualquer um que já viu Swing e conheça o mínimo de XML e HTML faz telas legais.

Artigo na Java Magazine - edições 21 e 22.