Dúvidas c/ RMI

17 respostas
H

Tava aki dando uma olhada em RMI, e keria saber se to “captando corretamente a parada”, entao la vao as duvidas:

1- Pelo q entendi, c/ RMI vc tem q instanciar o objeto no servidor, e procurar este objeto pelo nome no cliente, so entao, usar os metodos remotos dele, ou seja, n tem como instanciar objetos (de uma classe remota do servidor) num cliente, confere?

2- Os stubs ficam no lado do cliente, enquanto os skeletons fica no servidor, confere?

17 Respostas

H

Outro problema:

3- qnd eu to dando o comando rmic ServicoDeMensagens p gerar o stub e o skel, ele so ta gerando o stub, dai qnd inicio o servidor, dar problema (pq, creio eu, o skel n ta presente). pq ele so ta gerando o stub?? alguem sabe??? help ai

codigos:

Interface remota

package rmiApp;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Mensagem_IF extends Remote {
    public String getMensagem() throws RemoteException;
    public void setMensagem(String mensagem) throws RemoteException;
}

Objeto remoto q implementa a interface

package rmiApp;

import rmiApp.Mensagem_IF;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class ServicoDeMensagens extends UnicastRemoteObject implements Mensagem_IF {
    private String mensagem = "Não há nenhuma mensagem";

    public ServicoDeMensagens() throws RemoteException {}
    
    public String getMensagem() throws RemoteException {
        return this.mensagem;
    }
    
    public void setMensagem(String mensagem) throws RemoteException{
        this.mensagem = mensagem;
    }
}

Servidor q registra o ServicoDeMensagens

package rmiApp;

import java.rmi.Naming;

public class Servidor {

    public static void main( String[] args ){
        try {
            Mensagem_IF servidor = new ServicoDeMensagens();
            Naming.rebind("servidormsg", servidor);
            System.out.println("Servidor de mensagens no ar.");
        } catch (Exception e ) {
            e.printStackTrace();
        }
   }
}

Cliente

package rmiApp;

import java.rmi.Naming;

public class Cliente {

    public static void main( String[] args ){
        try {
            Mensagem_IF obj = (Mensagem_IF) Naming.lookup("rmi://localhost/servidormsg" );
            System.out.println("Recebido:" + obj.getMensagem());
            obj.setMensagem("Bom dia!");
        } catch (Exception e ) {
            e.printStackTrace();
        }
    }
}
Cocota

Sim cara, no CORE RMI, você utiliza os objetos do servidor. O passo a passo é chamar uma referência desse objeto pelo nome, e só então utilizar os métodos da classe a qual você fez referência.

hlds:

2- Os stubs ficam no lado do cliente, enquanto os skeletons fica no servidor, confere?

Sim, o Stub fica no cliente e o Skeleton no servidor.

Tem uma coisa muito interessante no AntiVirus McAfee Enterprise 8.0
Ele realiza atualizações com um programinha STUB no cliente que faz acesso à base.

Cocota

hlds:
Outro problema:

3- qnd eu to dando o comando rmic ServicoDeMensagens p gerar o stub e o skel, ele so ta gerando o stub, dai qnd inicio o servidor, dar problema (pq, creio eu, o skel n ta presente). pq ele so ta gerando o stub?? alguem sabe??? help ai

Cara,
Pra você gerar o SKELETON, na hora da chamada rmic você terá que especificar a versão 1.1 . Ou seja,

rmic -v1.1 Classe

Apartir da versão 1.2 você não precisa mais do arquivo skeleton. Isso fica abstraído.

Então, se você está tendo erro, não é por falta de Skeleton.
Eu não li seus códigos, tô com preguiça fuderoso à 01:24 da manhã.
Ajudei?

B

Entrando no Embalo, estou com uma dúvida cruel!

Eu criei todos os arquivos como fala no tutorial que tem aqui no guj e joguei dentro de uma pasta no c:, desta maneira funcionou legal o exemplo do tutorial.
Agora, se eu pego e crio essas classes dentro de um projeto no netbeans dentro de algum pacote, o rmic não consegue encontrar a classe e dá os seguintes erros:

error 1: .\MensageiroImp.class does not contain type MensageiroImp as expceted, but type com.testes.rmi.MensageiroImp. Please remove the file, ou make sure it appears in teh correct subdirectory of the classs path.
error 2: Class MensageiroImp not found.

Pelo que eu entendi, ele está reconhecendo “MensageiroImp” como “com.teste.rmi.MensageiroImp”… que é o pacote onde ele está dentro do projeto… É isto mesmo??? Uma luz, please!

Existe algum jeito mais fácil de criar isso no NetBeans, sem ter q ficar abrindo commands e digitando no dos???

Desde já, agradeço pessoal!

H

bezerrasantos:
Entrando no Embalo, estou com uma dúvida cruel!

Eu criei todos os arquivos como fala no tutorial que tem aqui no guj e joguei dentro de uma pasta no c:, desta maneira funcionou legal o exemplo do tutorial.
Agora, se eu pego e crio essas classes dentro de um projeto no netbeans dentro de algum pacote, o rmic não consegue encontrar a classe e dá os seguintes erros:

error 1: .\MensageiroImp.class does not contain type MensageiroImp as expceted, but type com.testes.rmi.MensageiroImp. Please remove the file, ou make sure it appears in teh correct subdirectory of the classs path.
error 2: Class MensageiroImp not found.

Pelo que eu entendi, ele está reconhecendo “MensageiroImp” como “com.teste.rmi.MensageiroImp”… que é o pacote onde ele está dentro do projeto… É isto mesmo??? Uma luz, please!

Existe algum jeito mais fácil de criar isso no NetBeans, sem ter q ficar abrindo commands e digitando no dos???

Desde já, agradeço pessoal!

eh pq tem q especificar o pacote e tem q rodar o “rmic” dentro da pasta “classes” (n entra na pasta do pacote): rmic pacote.Class

H

cocota vei, vlw, ajudasse p karamba. Mas, eu pensei q criava o stub e o skel pq nos 2 tutoriais q li, falavam q o rmic pacote.Class criava o stub e o skel (e n falaram de versao), mas ok. Dai msm assim ta dando o seguinte (msm) erro:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
        java.lang.ClassNotFoundException: rmiApp.ServicoDeMensagens_Stub
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
        at sun.rmi.transport.Transport$1.run(Transport.java:153)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
        at java.lang.Thread.run(Thread.java:595)
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:343)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at java.rmi.Naming.rebind(Naming.java:160)
        at rmiApp.Servidor.main(Servidor.java:10)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
        java.lang.ClassNotFoundException: rmiApp.ServicoDeMensagens_Stub
        at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
        at sun.rmi.transport.Transport$1.run(Transport.java:153)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
        at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.ClassNotFoundException: rmiApp.ServicoDeMensagens_Stub
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:242)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:430)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
        at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
        at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
        at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1538)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
        ... 9 more

Deatalhe: comando: java rmiApp.Servidor
o rmiregistry esta sendo inciado.
a classe Servidor ta no msm pacote da classe ServicoDeMensagens e do ServicoDeMensagens_Stub.

alguem sabe pq ta dando isso?

Cocota

Olá,

Teu erro é na hora de rodar o servidor?

Na hora de rodar o servidor?
Veja a sequência de passos pra que tudo funcione bem, e me diga quais são os passos que você está fazendo:

1. Escrever Interface remota
2. Implementar a Interface
3. Implementar Servidor que contém a Implementação da
interface remota
4. Gerar Stub da Interface
5. Registrar Servidor e Disparar Servidor
6. Escrever Cliente que utiliza métodos da Interface
H

exatmente cara: eu peguei estes passos de 2 tutoriais, eles sao:

1- escrever interface remota
2- implementar obejto q implementa a interface
3- implementar servidor q registra o nome do objeto
4- gerar stub (e skel)
5- implementar cliente q peskisa o nome do objeto
6- iniciar rmi registry (start rmiregistry)
7- iniciar servidor *** dar pau aki (excecao mostrada) ***
8- inciar cliente

eh isso ne o correto?

H

nas linhas da excecao tem:

java.lang.ClassNotFoundException: rmiApp.ServicoDeMensagens_Stub

mas p stub ta la :confused:

ele tem q tas junto aos outros .class da app ne?

Cocota

Exato.
O ServicoDeMensagens_Stub.class deve estar na mesma pasta/pacote dos arquivos .class, onde você deve respeitar a estrutura de pastas/pacotes dos arquivos.
Caso você esteja colocando seus arquivos .class em outra pasta diferente dos arquivos .java, você deve rodar o rmiregistry antes de mover o arquivo .class e a estrutura de pastas/pacotes dos arquivos .class deve ser a mesma da estrutura dos arquivos .java

Mas veja, seu código está assim:

package rmiApp;
 
 import java.rmi.Naming;
 
 public class Servidor {
 
     public static void main( String[] args ){
         try {
//linha X
             Mensagem_IF servidor = new ServicoDeMensagens();
//fim linha X
             Naming.rebind("servidormsg", servidor);
             System.out.println("Servidor de mensagens no ar.");
         } catch (Exception e ) {
             e.printStackTrace();
         }
    }
 }

A única diferença do seu, para o meu é que eu não utilizo uma variável no rebind. Eu mando um new direto no segundo parâmetro, assim:

Naming.rebind( "servidormsg", new ServicoDeMensagens() );

O que não pode ser possível que seja o erro.

O resto tá igualzinho.

H

Cara, n sei oq ta contecendo, testei tirar a variavel qnd registra o objeto (deu msm pau, logicamente n seria isso tb), to fazendo como vc fez, q merda!!!

Eu to fazendo pelo NetBeans 5.0, a estrutura de arquivos fica assim:

/Minha aplicacao/
/scr/rmiApp/.java
/build/classes/rmiApp/
.class

pq ta dando este pau???

H

Outra duvida, qnd usa rmic -v1.2 arquivo

ai n gera o skel ne isso? so gera o stub?

dai no cliente vc copia o stub e no servidor n precisa copiar nd? pq n vai ter mais skel. Ou precisa copiar o stub p servidor tb?

H

upa ai!

Cocota

Nao precisa ter nada além do que já existe no servidor.
E no cliente, você precisa copiar tudo respeitando a estrutura de pacotes.

Mas fique satisfeito que você entendeu o paradigma. Se está dando erro é por um motivo besta, indetectável aos nossos olhos atualmente.

Desculpe a demora, é que tive que sair com um amigo meu do peito que descobrimos que vai ser pai.

H

ok, vlw.

parabens p papai, ehehhe.

H

cocota ou alguem ai executa o jar desta app e ve se ta pegando ou nao.

seguinte consegui rodar esta aplicacao dps de mto sacrificio, mas n consigo roda-la c o .jar da app (n sei pq), vo fazer o seguinte: eu axo q pode ser problema aki, tem como alguem testar?

so descompactar o arquivo .rar e fazer:

  • start rmiregistry
  • java -jar rmiApp.jar (executa servidor)
  • java -cp rmiApp.jar rmiApp.Cliente (executa cliente)

se pegar ou nao posta ai q kero saber oq ta contecendo. usei o netbeans 5. vlws…

ps: se der execao (n pegou), se escrever 1 frase ai (ai pegou blz)

H

rpz, axo q finalmente consegui, eu n tava iniciando o start rmiregistry dentro da pasta do meus .class, eu ia la adivinhar isso??? sempre tem q inciar o rmiregsitry dentro da pasta dos .class???

Criado 1 de agosto de 2006
Ultima resposta 5 de ago. de 2006
Respostas 17
Participantes 3