0

I am new for Java RMI. I tried to start simple basic example java RMI with eclipse. But I cannot start Server and Client code. please help me to solve this problem.

Server Code: MyServer.java

 package in.rmi.test;
    import java.rmi.*;
    public class MyServer {
        public static void main(String args[]) {
            try {
                Adder stub = new AdderRemote();
                Naming.rebind("rmi://localhost:5000/sonoo", stub);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }        
    }

Adder.java

package in.rmi.test;

    import java.rmi.*;
    public interface Adder extends Remote{

    public int add(int x,int y)throws RemoteException;
    }

AdderRemote.java

package in.rmi.test;
import java.rmi.*;
import java.rmi.server.*;

public class AdderRemote extends UnicastRemoteObject implements Adder{
    private static final long serialVersionUID = 1L;

AdderRemote()throws RemoteException{
     super();
}
public int add(int x,int y){
      return x+y;
}
}

Exception while start Server

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: in.rmi.test.Adder
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:420)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:271)
    at sun.rmi.transport.Transport$2.run(Transport.java:202)
    at sun.rmi.transport.Transport$2.run(Transport.java:199)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:198)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:567)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.access$400(TCPTransport.java:619)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$1.run(TCPTransport.java:684)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$1.run(TCPTransport.java:681)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:681)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:275)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:252)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:378)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at java.rmi.Naming.rebind(Naming.java:177)
    at in.rmi.test.MyServer.main(MyServer.java:11)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: in.rmi.test.Adder
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:410)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:271)
    at sun.rmi.transport.Transport$2.run(Transport.java:202)
    at sun.rmi.transport.Transport$2.run(Transport.java:199)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:198)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:567)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.access$400(TCPTransport.java:619)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$1.run(TCPTransport.java:684)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$1.run(TCPTransport.java:681)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:681)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: in.rmi.test.Adder
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1206)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:278)
    at sun.rmi.server.LoaderHandler.loadClassForName(LoaderHandler.java:1219)
    at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:729)
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:673)
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:610)
    at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646)
    at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311)
    at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:265)
    at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1566)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1779)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
    ... 17 more

MyClient.java

package in.rmi.test;

import java.rmi.*;

public class MyClient {

    public static void main(String args[]) {
        try {

            System.setProperty("java.security.policy", "AllPermission.policy");
             System.setSecurityManager(new RMISecurityManager());
            Adder stub = (Adder) Naming.lookup("rmi://localhost:5000/sonoo");
            System.out.println(stub.add(34, 4));

        } catch (Exception e) {
            System.out.println(e);
        }
    }

}
Visva
  • 194
  • 1
  • 3
  • 11
  • Looks like Adder class is not compiled: `Caused by: java.lang.ClassNotFoundException: in.rmi.test.Adder` – Jens Jul 20 '16 at 05:53
  • yes, either the class definition not found , either you have different class signatures in your client than your server implementation – AntJavaDev Jul 20 '16 at 06:18
  • I compiling and running this program on eclipse only. It is compiled on eclipse. But it is not visible for rmiregistry. This happening while rebind. – Visva Jul 20 '16 at 06:38
  • When i work without **package name** on class, it is working fine. It will through exception when i go for package. – Visva Jul 20 '16 at 08:30
  • yes thats because you have different package name in the two implementations , as suggested above ....... the two classes must be the same. To achieve that make a CustomCore Library , that will hold all your Base Models , and import from that library to both the server and the client – AntJavaDev Jul 20 '16 at 08:59
  • I tried all codes in the same package. That is also raising the same exception. see the same edited example on above. – Visva Jul 20 '16 at 10:08
  • I had the same problem, Solved by following the below link http://stackoverflow.com/questions/464687/running-rmi-server-classnotfound – abel palaty Jul 21 '16 at 15:44

1 Answers1

0

I solved this problem by refering the following link
http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html
http://www.math.uni-hamburg.de/doc/java/tutorial/rmi/running.html

Start RMI Registory as like following :

rmiregistry -J-Djava.rmi.server.codebase=file:///home/visva/Downloads/1/ 5000 &

file:///home/visva/Downloads/1/ - is class path

Visva
  • 194
  • 1
  • 3
  • 11