1

何时创建 Stub、启动 Registry 并指定 Codebase?

我创建了一个 RMI 应用程序。我的简单应用程序有效。我的构建路径中有 RemoteObjInterface.class 的包,用于客户端和服务器包。我首先启动服务器应用程序,然后启动客户端应用程序。

但是,我查看了互联网上的其他示例,我看到它们启动了注册表,创建了一个存根并指定了一个代码库。

以下是我的程序:

RemoteObjInterface.class ”是我的接口,“ RemoteObjImplementation.class ”是我的服务器,“ Client.class ”是我的客户端。

public interface RemoteObjInterface extends Remote {
    public String someMethod() throws RemoteException;
        }

public class RemoteObjImplementation extends UnicastRemoteObject implements
    RemoteObjInterface {
   private static final long serialVersionUID = 1L;
   private static final int PORT = 1099;
   private static Registry registry;

public RemoteObjImplementation() throws RemoteException {
    super();
    }

@Override
public String someMethod() throws RemoteException {

    return new String("Hello");
    }

public static void main(String args[]) {

    Registry registry = LocateRegistry.createRegistry(PORT);

    registry.bind(RemoteObjInterface.class.getSimpleName(),
            new RemoteObjImplementation());

     }
}

public class Client {
    private static final String HOST = "localhost";
    private static final int PORT = 1099;
    private static Registry registry;

public static void main(String[] args) throws Exception {

registry = LocateRegistry.getRegistry(HOST, PORT);

 RemoteObjInterface remoteApi = (RemoteObjInterface) registry.lookup(RemoteObjInterface.class.getSimpleName());

    System.out.println("Message = " +
            remoteApi.someMethod();

    }
}
4

1 回答 1

1

何时创建存根

创建存根是导出远程对象的副作用,如果它是扩展的,这反过来又是构造它的副作用UnicastRemoteObject

启动注册表

当你想启动它。bind()例如,在您开始打电话之前rebind()

并指定代码库?

您根本不需要使用此功能,它是可选的。如果您希望您的客户端能够动态下载类而不是提前将它们分发给客户端,java.rmi.server.codebase请在导出任何远程对象(包括注册表)之前在服务器 JVM 中指定系统属性,并确保它指向一个 URL注册表和客户端都可以访问。

于 2013-03-19T23:33:48.153 回答