如何使用java 1.7启动rmic注册表和服务器?

时间:2013-08-09 14:45:32

标签: rmi java-7

我是java RMI的新手,实际上我编写,编译并启动rmic,并且还尝试启动服务器但由于_stub'ClassNotFound'异常而失败.....我正在使用java 7 ...我搜索很多关于谷歌,但没有人告诉一步一步的例子,可以工作...我有一些关于stteing代码库和安全策略的想法,但不是很明确的建议,如何做到这一点..请帮助告诉我步骤,包括命令行.. ........请...我有一切只是告诉我如何启动服务器,以及所需的设置,如代码库或策略设置等...谢谢

2 个答案:

答案 0 :(得分:1)

您无需使用rmic。相反,创建服务器对象并调用具有port参数的exportObject()方法重载之一。例如,

MyRemoteIntf stub = UnicastRemoteObject.exportObject(server, 0);

这将导致RMI自动生成存根。 (关于这一点,文档非常不清楚。如果你使用没有port参数的版本,它将只使用旧的rmic生成的存根,而不是自动生成它们。)

此外,请确保您的远程接口位于注册表和任何客户端的代码库中。如果你没有正确完成,你会得到不同的错误。已经在Stackoverflow上回答了很多次;搜索“rmi ClassNotFoundException”。

答案 1 :(得分:-1)

没有必要使用rmic命令,因为java(J2SE)5.0存根是在运行时动态生成的。

以下是如何使用RMI的基本步骤示例。

首先定义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

相关问题