2011-12-31 14 views
5

Ho seguito l'esempio sui libri ma sto ricevendo molti errori.Head First Java - Problemi RMI

Mi sono imbattuto in rmiregistry.

Ho quindi fatto.

java MyremoteImpl 

che mi ha dato il seguente errore:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: MyRemoteImpl_Stub 
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396) 
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) 
at sun.rmi.transport.Transport$1.run(Transport.java:159) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.rmi.transport.Transport.serviceCall(Transport.java:155) 
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:662) 
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255) 
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233) 
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359) 
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
at java.rmi.Naming.rebind(Naming.java:160) 
at MyRemoteImpl.main(MyRemoteImpl.java:25) 
    Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: MyRemoteImpl_Stub 
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386) 
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) 
at sun.rmi.transport.Transport$1.run(Transport.java:159) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.rmi.transport.Transport.serviceCall(Transport.java:155) 
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:662) 
    Caused by: java.lang.ClassNotFoundException: MyRemoteImpl_Stub 
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:306) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:247) 
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:434) 
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:1574) 
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) 

MyRemoteClient mi dà il seguente errore:

java.rmi.NotBoundException: RemoteHello 
at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:106) 
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386) 
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) 
at sun.rmi.transport.Transport$1.run(Transport.java:159) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.rmi.transport.Transport.serviceCall(Transport.java:155) 
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) 
at  java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:662) 
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255) 
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233) 
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359) 
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
at java.rmi.Naming.lookup(Naming.java:84) 
at MyRemoteClient.go(MyRemoteClient.java:11) 
at MyRemoteClient.main(MyRemoteClient.java:6) 

Ecco il mio codice MyRemoteImpl:

import java.rmi.Naming; 
import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote { 

@Override 
public String sayHello(){ 
    return "server says, 'Hey'";  
} 

public MyRemoteImpl() throws RemoteException{ 

} 

    public static void main (String [] args){ 

try{ 
    MyRemote service = new MyRemoteImpl(); 
    Naming.rebind("RemoteHello", service); 
} catch (Exception ex) { ex.printStackTrace(); 

} 
    } 
} 

Codice MyRemoteClient :

import java.rmi.*; 


public class MyRemoteClient { 
public static void main(String [] args){ 
    new MyRemoteClient().go(); 
} 

public void go(){ 
    try { 
     MyRemote service = (MyRemote) Naming.lookup("rmi://127.0.0.1/RemoteHello"); 
     String s = service.sayHello(); 

     System.out.println(s); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 

    } 
} 

} 

Codice MyRemote:

import java.rmi.*; 

public interface MyRemote extends Remote { 

public String sayHello() throws RemoteException; 

} 
+0

Come è dichiarato MyRemote? – Tudor

+0

Non so se questo ha qualcosa a che fare con l'eccezione che stai ricevendo, ma non dovresti mai dichiarare le classi nel pacchetto predefinito. –

+0

Ho usato i miei pacchetti ho avuto lo stesso errore, quindi ho usato i pacchetti predefiniti e ho ancora lo stesso problema –

risposta

0

Il "codice dinamico il download tramite RMI" sezione documenti questo problema, che può essere trovato @http://docs.oracle.com/javase/1.4.2/docs/guide/rmi/codebase.html

E per citare:

6.1 If you encounter a problem running your RMI server

The first problem you might encounter is the receipt of a ClassNotFoundException when attempting to bind or rebind a remote object to a name in the registry. This exception is usually due to a malformed codebase property, resulting in the registry not being able to locate the remote object's stubs or other classes needed by the stub.

It is important to note that the remote object's stub implements all the same interfaces as the remote object itself, so those interfaces, as well as any other custom classes declared as method parameters or return values, must also be available for download from the specified codebase.

Most frequently, this exception is thrown as a result of omitting the trailing slash from the URL value of the property. Other reasons would include: the value of the property is not a URL; the path to the classes specified in the URL is incorrect or misspelled; the stub class or any other necessary classes are not all available from the specified URL.

The exception that you may encounter in such a case would look like this:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: examples.callback.MessageReceiverImpl_Stub 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: examples.callback.MessageReceiverImpl_Stub 
java.lang.ClassNotFoundException: examples.callback.MessageReceiverImpl_Stub 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Compiled Code) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(Compiled Code) 
    at sun.rmi.server.UnicastRef.invoke(Compiled Code) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Compiled Code) 
    at java.rmi.Naming.rebind(Compiled Code) 
    at examples.callback.MessageReceiverImpl.main(Compiled Code) 
RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: examples.callback.MessageReceiverImpl_Stub 
+0

Ho provato tutto con rmi: // localhost/RemoteHello "ma ancora senza fortuna –

+0

@ YK-47 Ovviamente tu * non ha * 'provato tutto' del tutto, altrimenti avresti funzionato – EJP

+0

Non ci sono prove qui che stia usando la funzione codebase a tutti, figuriamoci erroneamente. – EJP

1

Il Registro di sistema non ha quella classe sul suo classpath. O devi eseguire il Registro di sistema in modo tale che lo faccia, ad es. LocateRegistry.createRegistry(), oppure è necessario utilizzare la funzionalità Codebase RMI in modo che il Registro e il client sappiano da dove ottenere le classi mancanti.

2

ho ottenuto questo errore prima e scoperto ho dovuto correre "rmiregistry" alla cartella in cui "MyRemoteImpl_Stub.class" è. In bocca al lupo!

1

Prova questo nel main (String [] args) del server:

try{ 
    MyRemote service = new MyRemoteImpl(); 
    //Naming.rebind("RemoteHello", service); 
    Registry registry = LocaleRegistry.getRegistry(); 
    registry.bind("RemoteHello", service); 
} catch (Exception ex) { 
    ex.printStackTrace(); 
}