RMI - problemaço

31 respostas
rodrigo.achilles

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:

31 Respostas

_fs

Em que momento? O que é “preso”?

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

danieldestro

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

danieldestro

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

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

_fs

Salvou minha vida :smiley:

danieldestro

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

_fs

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.

rodrigo.achilles

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.

_fs

Que erro cara?

rodrigo.achilles

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.

rodrigo.achilles

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.

danieldestro

O segundo link deve te resolver o problema.

rodrigo.achilles

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:

_fs

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

rodrigo.achilles

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

rodrigo.achilles

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.

danieldestro

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.

Ironlynx

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? :?:

_fs

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

danieldestro

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.

rodrigo.achilles

Olá pessoal,

Daniel, é isso mesmo. A classe foi eu que criei, aí babou né. Mais com Serializable funciona legal.

Uma lição importantíssima que tirei disso tudo foi que, não adianta se afobar em um projeto e partindo direto para implementação, primeiro faça análise do problema com calma, e sempre deixe os módulos com Alta Coesão e Baixo Acoplamento, pois com isso vc terá mais facilidade de se localizar e manipular as classes sem estresse, o meu projeto estava em apenas 6 classes o cliente só tinha 1 classe contendo 1000 linhas e isso era inviável. Me perdia. Agora separei, uma pra comunicação, uma para Interface, um controlador, … outro nível, ou seja, estou fazendo tudo de novo.

:stuck_out_tongue:
Mais quero agradecer mais uma vez a galera.

E antes de finalizar, Gostei da idéia do Ironlynx. Lipe, se realmente DualRpcServer é muito mais fácil do que RMI, poderia nos mostrar um exemplo. Mais não precisa ser o seu, pode ser uma apostila, algo do gênero para termos idéia.
BLZ.
Abraços galera.

danieldestro

http://www.retrogui.com/cgi-bin/wiki_dualrpcserver.pl/Sample_Code

_fs

Basicamente isso

cliente:

DualRpcClient client = new DualRpcClient("localhost", 4050);
client.connect();

String s = (String) client.call("simple.server.ServerHandler", "simonSays", "a parameter" );

server:

DualRpcServer server = new DualRpcServer("localhost", 4050, config);
server.registerServerSideHandlerClassname( "simple.server.ServerHandler");
server.listen();

sendo que ServerHandler é uma classe que estende AbstractServerRpcHandler e tem o método chamado simonSays( String s );

;D

rodrigo.achilles

Muito simples mesmo. Mas quando um cliente quiser assumir o papel de servidor e quiser escutar algo que o servidor tem a dizer. Posso fazer o mesma coisa. Correto?

Isso está mais parecendo a implementação simples de um socket e um ServerSocket, não?!?

E RMI, vcs não acham que é tão simples quanto o DualRpc?
Me deêm uma vantagem do DualRpc em relação ao RMI?

Abraçoss.
Galera :slight_smile:

_fs

Sim, basta fazer a mesma coisa.

E sim, dualrpc é só um wrapper hehe exatamente por isso é mais simples :smiley:

Cara, se você tem tesão por stubs e skeletons, vai fundo ;D

rodrigo.achilles

Não Lipe, eu não sou viciado em RMI, mas é o jeito mais simples que eu sei até o momento do que socket, e agora fiquei sabendo essa.

Como meu projeto já está em RMI, deixo para fazer com DualRpc nos próximos projetos :slight_smile:

E valeu mesmo pelas dicas :wink:

E uma coisa que reparei, é que esse pacote do DualRpc, necessita que o JRE tenho o pacote instalado como o JOGL, que muitos projetos que eu fiz em OpenGL, era necessário levar o pacote para que possa ser executado…

Uma pergunta, tem como fazer com que o meu JAR, leiam os pacotes sem precisar instalar nas máquinas. Como posso fazer isso.

Agradeço, pois essa informação seria muito importante para todos os meus projetos, a maioria uso o OpenGL, e preciso instalar antes nas máquinas.

Abraços galera.

_fs

:smiley:

Se você quer fazer algo ilegal, simplesmente coloque o conteudo dos jars do DualRpc (que são minúsculos) junto com o JAR da sua aplicação.

Caso queira fazer do jeito correto, no bat que roda o seu JAR normal, faça assim, considerando que os jars do DR estão no mesmo diretório:

java -cp client.jar, server.jar -jar meujarlegal.jar

rodrigo.achilles

Valeu Lipe.

Mais fui testar com o JOGL eu não consegui, ele só roda colocando os arquivos no JRE, onde se coloca dois JARs, um no Bin, e o outro no Lib.

Alguém sabe como posso colocar no meu projeto o JOGL sem que eu precise instalar nas máquinas?

O que vc Lipe está perfeito, mais em OpenGL não que reconhecer o arquivo.
Dá erro.

mcampelo

LIPE:

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

Lipe,

qto vc tá ganhando como garoto propaganda do DualRpcServer? :smiley:

Falando sério agora. Já até li a doc do bicho por recomendação sua. Mas na prática. Já usou? O bicho é bom mesmo? Pontos positivos? Negativos?

[]'s
Marco Campêlo

_fs

Já usei sim :smiley:

Pontos fortes: fácil de usar, faz o trabalho.
Pontos fracos: “Load tests indicate that up to 1500 simultaneous connections for a single DualRpcServer instance”.

Se você precisa mais de 1500 conexões por server (sendo que você pode instanciar diversos servers na mesma máquina) DRPC não é pra você.

Cara, DRPC + proxies = babinha.

elson

Olá rapaziada como faço para validar um objeto remoto dentro de um jtextfield,ele tem que conter um texto maior que 20 caracteres.

Valeu abraços!!

R

elson:
Olá rapaziada como faço para validar um objeto remoto dentro de um jtextfield,ele tem que conter um texto maior que 20 caracteres.
Valeu abraços!!

Olá Elson … Sei querer te desanimar mais acho que ninguém vai responder esta pergunta, que além de não ter muito a ver com o tópico está muito mal elaborada.
Recomendo rever, melhora-la e postar no forum como uma nova mensagem.

Boa sorte.
Roger Leite

Criado 19 de maio de 2005
Ultima resposta 4 de jun. de 2008
Respostas 31
Participantes 7