Java:远程方法调用(RMI)

时间:2013-06-19 21:26:39

标签: java rmi

我试图运行简单的RMI服务,其中服务器和客户端在同一台机器上。不幸的是,每次我尝试 运行服务器类 时,我都会遇到异常。我将服务器和客户端保存在单独的文件夹中,然后将所需的文件复制到客户端。

这些是我采取的步骤:

  1. 添加服务器文件保存到CLASSPATH的文件夹。
  2. 启动rmiregistry。 ( 据我所知,我不再需要使用存根文件更新存根文件
  3. 运行服务器。 < - 例外
  4. 运行客户端。
  5. 文件夹层次结构:

    server [AddServerIntf.class,AddServerImpl.class,AddServer.class] client [AddServerIntf.class,AddClient.class]

    例外

    C:\Users\Szymon\Desktop\serwer>java AddServer
    Exception: java.rmi.ServerException: RemoteException occurred in server thread;
    nested exception is:
            java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
    tion is:
            java.lang.ClassNotFoundException: AddServerIntf
    

    代码

    远程接口

    import java.rmi.*;
    
    public interface AddServerIntf extends Remote {
       double add(double d1, double d2) throws RemoteException;
    }
    

    实现上述界面的类

    import java.rmi.*;
    import java.rmi.server.*;
    
    public class AddServerImpl extends UnicastRemoteObject
       implements AddServerIntf {
    
       public AddServerImpl() throws RemoteException {
       }
       public double add(double d1, double d2) throws RemoteException {
          return d1 + d2;
       }
    }
    

    创建服务器的类

    import java.net.*;
    import java.rmi.*;
    
    public class AddServer {
       public static void main(String args[]) {
    
          try {
             AddServerImpl addServerImpl = new AddServerImpl();
             Naming.rebind("AddServer", addServerImpl);
          }
          catch(Exception e) {
             System.out.println("Exception: " + e);
          }
       }
    }
    

    客户

    import java.rmi.*;
    
    public class AddClient {
       public static void main(String args[]) {
          try {
              String addServerURL = "rmi://" + args[0] + "/AddServer";
              AddServerIntf addServerIntf = (AddServerIntf)Naming.lookup(addServerURL);
             System.out.println("1st: " + args[1]);
             double d1 = Double.valueOf(args[1]).doubleValue();
             System.out.println("2nd: " + args[2]);
    
             double d2 = Double.valueOf(args[2]).doubleValue();
             System.out.println("Sum: " + addServerIntf.add(d1, d2));
          }
          catch(Exception e) {
             System.out.println("Exception: " + e);
          }
       }
    }
    

    存根文件的效果类似

    C:\Users\Szymon\Desktop\serwer>java AddServer
    Exception: java.rmi.ServerException: RemoteException occurred in server thread;
    nested exception is:
            java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
    tion is:
            java.lang.ClassNotFoundException: AddServerImpl_Stub 
    

1 个答案:

答案 0 :(得分:2)

注册表在其CLASSPATH上没有远程接口。恕我直言,最好的解决方案是使用LocateRegistry.createRegistry()在服务器JVM中运行Registry。

  

据我所知,我不再需要制作存根文件

不正确。请参阅Javadoc的序言UnicastRemoteObject。您需要在远程对象的构造函数中提供super(0)行,以满足此处指定的条件。