我试图运行简单的RMI服务,其中服务器和客户端在同一台机器上。不幸的是,每次我尝试 运行服务器类 时,我都会遇到异常。我将服务器和客户端保存在单独的文件夹中,然后将所需的文件复制到客户端。
这些是我采取的步骤:
文件夹层次结构:
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
答案 0 :(得分:2)
注册表在其CLASSPATH上没有远程接口。恕我直言,最好的解决方案是使用LocateRegistry.createRegistry()在服务器JVM中运行Registry。
据我所知,我不再需要制作存根文件
不正确。请参阅Javadoc的序言UnicastRemoteObject
。您需要在远程对象的构造函数中提供super(0)
行,以满足此处指定的条件。