2013-06-19 42 views
2

我试图运行简单的RMI服务,其中服务器和客户端在同一台机器上。不幸的是,每次我尝试运行服务器类别我收到一个异常。我将服务器和客户端保存在单独的文件夹中,并将需要的文件复制到客户端。Java:远程方法调用(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 
+0

+1的细节和格式。 java.lang中。ClassNotFoundException:AddServerIntf,看起来你有一些类路径问题。你确定“存根”在类路径中吗? – kosa

+0

细节不足。你需要显示*完整的堆栈跟踪,而不仅仅是最高位。 – EJP

+0

@EJP这就是我得到的。我会尽力提供更多细节。 – ashur

回答

2

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

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

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

+0

嗯......好的,我将制作存根并再次运行。 – ashur

+0

好吧,所以我试着用存根,我得到这个'C:\ Users \ Szymon \ Desktop \ serwer> java AddServer 异常:java.rmi.ServerException:RemoteException发生在服务器线程; 嵌套异常是: java.rmi.UnmarshalException:错误解组参数;嵌套的excep 灰是: java.lang.ClassNotFoundException:AddServerImpl_Stub' – ashur

+0

所以做我说的super(0)! – EJP