2

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

这些是我采取的步骤:

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

文件夹层次结构:

服务器 [AddServerIntf.class, AddServerImpl.class, AddServer.class] 客户端 [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 
4

1 回答 1

2

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

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

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

于 2013-06-19T21:29:56.163 回答