0

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

4

2 回答 2

1

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

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

这将导致 RMI 自动生成存根。(文档在这一点上非常不清楚。如果您使用没有端口参数的版本,它将仅使用旧rmic的 - 生成的存根,而不是自动生成它们。)

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

于 2013-08-12T04:53:23.033 回答
-1

无需使用该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

于 2013-08-09T21:48:38.423 回答