Encountering UnmarshalException ClassNotFoundException in RMI while attempting to revoke Remote Method in Netbeans 6.5/windows xp. Both rmi client and server programs are running in the same machine.
RMI Client Program:
Source Code Location
F:\\NewRMIClient\\src\\newrmiclient\\RMIClient.java
F:\\NewRMIClient\\src\\newrmiclient\\RemoteInterface.java
Class Files Location
F:\\NewRMIClient\\build\\classes\\newrmiclient\\RemoteInterface.class
F:\\NewRMIClient\\build\\classes\\newrmiclient\\RMIClient.class
Built JAR File Location
F:\\NewRMIClient\\dist\\NewRMIClient.jar
RemoteInterface.java
package newrmiclient;
import java.rmi.Remote; import java.rmi.RemoteException;
public interface RemoteInterface extends Remote { void sendMessageFilePath(String messagePath) throws RemoteException; }
RMIClient.java
package newrmiclient;
import java.rmi.*;
import java.rmi.registry.*;
public class RMIClient
{
static public void main(String args[])
{
RemoteInterface rmiServer;
Registry registry;
String serverAddress="192.169.4.11";
String serverPort="3232";
String text="hello";
System.out.println("sending "+text+" to "+serverAddress+":"+serverPort);
System.setProperty("java.security.policy","file:/F:/PolicyFiles/rules.policy");
if(System.getSecurityManager() == null)
{
System.setSecurityManager(new RMISecurityManager());
}
try{
// get the “registry”
registry=LocateRegistry.getRegistry(serverAddress,(new Integer(serverPort)).intValue());
// look up the remote object
rmiServer=(RemoteInterface)(registry.lookup("MessagePath"));
// call the remote method
rmiServer.sendMessageFilePath(text);
}
catch(RemoteException e){
e.printStackTrace();
}
catch(NotBoundException e){
e.printStackTrace();
}
}
}
RMI Server Program:
Source Code Location
F:\\RMIProj\\src\\rmiproj\\RemoteInterface.java
F:\\RMIProj\\src\\rmiproj\\RmiServer.java
Class Files Location
F:\\RMIProj\\build\\classes\\rmiproj\\RemoteInterface.class
F:\\RMIProj\\build\\classes\\rmiproj\\RmiServer.class
F:\\RMIProj\\build\\classes\\rmiproj\\RmiServer_Skel.class
F:\\RMIProj\\build\\classes\\rmiproj\\RmiServer_Stub.class
Built JAR Location
RemoteInterface.java
package rmiproj;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RemoteInterface extends Remote
{
void sendMessageFilePath(String messagePath) throws RemoteException;
}
RmiServer.java
package rmiproj;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RmiServer extends UnicastRemoteObject implements RemoteInterface
{
int thisPort = 3232;
Registry registry; // rmi registry for lookup the remote objects.
public RmiServer() throws RemoteException
{
try
{
System.setProperty("java.rmi.server.codebase","file:/F:/RMIProj/");
System.setProperty("java.rmi.server.hostname","RMIServer");
System.setProperty("java.security.policy","file:/F:/PolicyFiles/rules.policy");
if(System.getSecurityManager() == null)
{
System.setSecurityManager(new RMISecurityManager());
}
// create the registry and bind the name and object.
registry = LocateRegistry.createRegistry( thisPort );
registry.rebind("MessagePath", this);
}
catch(RemoteException re)
{
re.printStackTrace();
}
}
// This method is called from the remote client by the RMI.
// This is the implementation of the “RemoteInterface”.
public void sendMessageFilePath(String messageFilePath) throws RemoteException
{
System.out.println(messageFilePath);
}
public static void main(String args[]) throws RemoteException
{
RmiServer s=new RmiServer();
}
}
Location of the policy file: F:\\PolicyFiles\\rules.policy
rules.policy grant { permission java.security.AllPermission; };
When attempting to invoke remote method from client, following exception is thrown on console:
sending hello to 192.169.4.11:3232
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: rmiproj.RemoteInterface
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at newrmiclient.RMIClient.main(RMIClient.java:28)
Caused by: java.lang.ClassNotFoundException: rmiproj.RemoteInterface
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: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)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
Please help me to resolve this issue.
You need to have the rmiproj.RemoteInterface
class available in your client JVM. Try including rmiproj.RemoteInterface
in NewRMIClient.jar
(or another JAR included in your client's classpath).
Note also that the remote Object you are calling implements rmiproj.RemoteInterface
and NOT newrmiclient.RemoteInterface
. This means that you have some work to do on your code before it is going to work even with rmiproj.RemoteInterface
in the client JAR. rmiServer
needs to be of type rmiproj.RemoteInterface
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.