我是java RMI的新手,实际上我编写,编译并启动rmic,并且还尝试启动服务器但由于_stub'ClassNotFound'异常而失败.....我正在使用java 7 ...我搜索很多关于谷歌,但没有人告诉一步一步的例子,可以工作...我有一些关于stteing代码库和安全策略的想法,但不是很明确的建议,如何做到这一点..请帮助告诉我步骤,包括命令行.. ........请...我有一切只是告诉我如何启动服务器,以及所需的设置,如代码库或策略设置等...谢谢
答案 0 :(得分:1)
您无需使用rmic
。相反,创建服务器对象并调用具有port参数的exportObject()
方法重载之一。例如,
MyRemoteIntf stub = UnicastRemoteObject.exportObject(server, 0);
这将导致RMI自动生成存根。 (关于这一点,文档非常不清楚。如果你使用没有port参数的版本,它将只使用旧的rmic
生成的存根,而不是自动生成它们。)
此外,请确保您的远程接口位于注册表和任何客户端的代码库中。如果你没有正确完成,你会得到不同的错误。已经在Stackoverflow上回答了很多次;搜索“rmi ClassNotFoundException”。
答案 1 :(得分:-1)
没有必要使用rmic
命令,因为java(J2SE)5.0存根是在运行时动态生成的。
首先定义Remote接口,定义客户端可以看到和执行的操作:
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());
现在你的服务器已启动并运行,你需要一个存根实例A.K.A客户端代理:
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