Dúvida RMI RemoteException [RESOLVIDO]

10 respostas
M

Bom dia galera,

Antes de mais nada, gostaria de parabenizar o fórum, já tirei muitas dúvidas aqui.
Está é primeira postagem que faço, pois até hoje, todas as dúvidas que tinha, consegui resolve-lás somente pesquisando aqui.

Bom, vamos ao que interessa.
Seguinte, estou desenvolvendo um aplicativo no qual terei que usar o RMI.
Comecei a estudar sobre o assunto e fazer alguns testes.
Dos testes feitos, alguns funcionaram perfeitamente, porém sem segurança.
Aí resolvi dar um UP no exemplo e tentar implementar RMI em meu projeto.
Porém comecei a ter algumas dificuldades e agora estou preso.

Alguém poderia me ajudar. Segue abaixo minhas classes.

//Essa é a classe Servidor
package gerenciadorfila.servicoremoto;

import java.util.Date;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;

public class Server extends UnicastRemoteObject implements Hello {

    public Server() throws RemoteException {
    }

    public Date getDate() throws RemoteException {
        return new Date();
    }

    public static void main(String args[]) {
        Server cal;

        System.getProperties().put("java.security.policy", "file:/D:/Workspace/policy");

        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }

        try {
            cal = new Server();
            Registry registry = LocateRegistry.createRegistry(1099);
            registry.rebind("Server", cal);
            System.out.println("Ready !");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getString() throws RemoteException {
        return "teste";
    }
}
// Essa é a classe Cliente

import java.net.MalformedURLException;
import java.util.Date;
import java.rmi.*;

public class Client {
    // constructor

    public Client() {
    }

    public static void main(String args[]) {
        long t1 = 0, t2 = 0;
        Date date;
        Hello remoteCal;
        String teste = "vazio";

        System.getProperties().put("java.security.policy", "file:/D:/Workspace/policy");

        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }

        try {
            String[] list = Naming.list("rmi://localhost/");
            for (int i = 0; i < list.length; i++) {
                System.out.println(list[i]);
            }
            remoteCal = ((Hello) Naming.lookup("//localhost:1099/Server"));

            t1 = remoteCal.getDate().getTime();
            Thread.sleep(20);
            t2 = remoteCal.getDate().getTime();

            teste = remoteCal.getString();
        } catch (InterruptedException e) {
            System.out.println("ie");
            System.out.println(e);
        } catch (MalformedURLException e) {
            System.out.println("mue");
            System.out.println(e);
        } catch (NotBoundException e) {
            System.out.println("nbe: " + e.getMessage());
            System.out.println(e);
        } catch (RemoteException e) {
            System.out.println("re");
            System.out.println(e);
        }

        System.out.println("This RMI call took" + (t2 - t1) + " milliseconds");
        System.out.println(teste);
    } // main
} // class CalendarUser
//E essa é minha interface

import java.rmi.*;

public interface Hello extends Remote {

    java.util.Date getDate() throws RemoteException;
    String getString() throws RemoteException;
}

Bom, as dificuldades que estou encontrando é:
1 - Na hora de compilar o código, não sei como passar os parametros para o java.
Então para rodar o código, estou rodando direto do netbeans.

2 - O servidor está rodando tranquilo, porém quando vou rodar o cliente ele me retorna um remoteexception.

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
        java.lang.ClassNotFoundException: gerenciadorfila.servicoremoto.Hello
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at java.rmi.Naming.lookup(Naming.java:84)
        at Client.main(Client.java:30)
Caused by: java.lang.ClassNotFoundException: gerenciadorfila.servicoremoto.Hello
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:711)
        at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:655)
        at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:592)
        at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
        at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
This RMI call took0 milliseconds
vazio
        at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
        at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1530)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1492)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)

Então é isso pessoal. Espero que me ajudem, pois estou precisando muito disso.
Estou a + ou - 2 ou 3 dias pesquisando no guj, javafree e em outros sites especializados em java e não consigo resolver meu problema.

Desde já agradeço à todos.

Atenciosamente,

Rafael Souza e Silva.

10 Respostas

M

Ah, esqueci de falar…
o cliente e o servidor estão na mesma máquina, só que em projetos diferentes.

Att…

L
Caused by: java.lang.ClassNotFoundException: gerenciadorfila.servicoremoto.Hello

Esta faltando sua interface no classpath do seu Client.

Depois tente fazer seu lookup do objeto assim:

Object initialRef = Naming.lookup("//localhost:1099/Server"); remoteCal = (Hello) javax.rmi.PortableRemoteObject.narrow( initialRef, Hello.class );

M

Icegatti, muito obrigado pela resposta.

Mas num entendi o que você quis dizer com setar o classpath do cliente…
em todos os tuto’s que li, todos falavam pra setar o classpath = “”…

Você poderia me dar um exemplo?!

Att.

L

Você esta utilizando o NetBeans, infelizmente sou um péssimo conhecedor da ferramenta, tive poucos contatos, mas o que eu estava querendo dizer é que de alguma forma na sua classe Client você precisa ter a referência para a Interface Hello.

Acredito que o NetBeans tenha como fazer tal referência para a interface Hello, você disse que estão em projetos diferentes, tente então referenciar o projeto que está a sua interface Hello no projeto em que está sua classe Client.

Isso deve te ajudar:
http://netbeans.org/kb/docs/java/project-setup.html#projects-classpath
Utilize o botão Add Project…

M

Hmmmm… entendi…

Então, fiz isso, agora mudou a exception. Segue abaixo:

Exception in thread "main" java.lang.ClassCastException
        at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:229)
        at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)
        at Client.main(Client.java:32)
Caused by: java.lang.ClassCastException: $Proxy0 cannot be cast to org.omg.CORBA.Object
        at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:212)
        ... 2 more
Java Result: 1

O que poderia ser agora?!?!

Att.

A

mamangava:

1 - Na hora de compilar o código, não sei como passar os parametros para o java.
Então para rodar o código, estou rodando direto do netbeans.

Isso resolve seu problema.

L

Desculpe, me enganei no narrow, volte para o que estava antes.

remoteCal = ((Hello) Naming.lookup("//localhost:1099/Server"));
M

Ola Andre Brito,

Então, acho que me compliquei na explicação sobre os parametros.
Os parametros que eu me referia, eram aqueles que são passados pelo cmd…
por exemplo… C:> java -classpath etc etc…

E eu não quero ficar rodando este projeto pelo cmd pq eu estou fazendo testes…
portanto acho mais fácil rodar pelo próprio netbeans.

Desculpe pela ambiguidade…
Acho que agora ficou melhor…

Att,

Rafael.

M

Quase a msm exception…

Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to Hello
        at Client.main(Client.java:31)
Java Result: 1
M

Consegui… o problema é q eu tinha a interface no meu projeto cliente tbm…

ai eu adicionei o projeto q tem a interface e usei a interface desse projeto…
ai funfou…

Icegatti e Andre Brito…

Muito obrigado pela ajuda…

Att…

Rafael Souza e Silva

Criado 20 de maio de 2011
Ultima resposta 20 de mai. de 2011
Respostas 10
Participantes 3