我是 java RMI 的新手,实际上我编写、编译并启动了 rmic,并且还尝试启动服务器但由于 _stub 'ClassNotFound' 异常而失败.....我正在使用 java 7... 我搜索了很多谷歌但没有人告诉一步一步的例子可以工作......我对stteing代码库和安全策略有一些想法,但不是很清楚的建议如何做到这一点......请帮助告诉我包括命令行的步骤...... .....拜托...我有一切,只是告诉我如何启动服务器,以及代码库或策略设置等所需的设置......谢谢
2 回答
你不需要使用rmic
. 相反,创建您的服务器对象并调用exportObject()
具有端口参数的方法重载之一。例如,
MyRemoteIntf stub = UnicastRemoteObject.exportObject(server, 0);
这将导致 RMI 自动生成存根。(文档在这一点上非常不清楚。如果您使用没有端口参数的版本,它将仅使用旧rmic
的 - 生成的存根,而不是自动生成它们。)
此外,请确保您的远程接口位于注册表和任何客户端的代码库中。如果您没有正确执行此操作,您将得到不同的错误。这已经在 Stackoverflow 上回答了很多次;搜索“rmi ClassNotFoundException”。
无需使用该rmic
命令,因为 java (J2SE) 5.0 存根是在运行时动态生成的。
以下是如何使用 RMI 的基本分步示例。
首先定义定义客户端可以看到和做的远程接口:
public interface FooService extends Remote {
// Don't forget to add throws RemoteException.
public void bar() throws RemoteException;
}
注意:如果您不添加throws RemoteException
到方法声明中,您将遇到以下异常:
java.lang.IllegalArgumentException: illegal remote method encountered: public abstract void RMIExample.FooService.bar()
在您定义了客户端可以做什么之后,您必须在服务器幻灯片上定义方法的具体实现:
public class FooServiceImpl extends UnicastRemoteObject implements FooService {
public FooServiceImpl() throws RemoteException {
super();
}
public void bar() {
System.out.println("I was remotely invoked!");
}
}
实现类必须继承UnicastRemoteObject
并实现您之前定义的 Remote 接口,并且该类必须具有抛出 RemoteException 的构造函数。
现在您已经完全定义了远程功能,您必须将实现对象绑定到服务器端的 URL:
// 4000 is the port to listen on.
LocateRegistry.createRegistry(4000);
Naming.rebind("//127.0.0.1:4000/foobar", new FooServiceImpl());
现在您的服务器已启动并运行,您需要一个存根实例,即客户端的代理:
FooService fooService =
(FooService)Naming.lookup("//127.0.0.1:4000/foobar");
最后调用远程方法:
fooService.bar();
应在服务器端打印以下内容:
I was remotely invoked!
参考:
http://en.wikipedia.org/wiki/Java_remote_method_invocation http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/relnotes.html