我正在尝试运行简单的 RMI 服务,其中服务器和客户端位于同一台机器上。不幸的是,每次我尝试运行服务器类时都会遇到异常。我将服务器和客户端保存在单独的文件夹中,并将所需的文件复制到客户端。
这些是我采取的步骤:
文件夹层次结构:
服务器 [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