【问题标题】:Understanding java RMI exportObject method了解java RMI exportObject方法
【发布时间】:2016-10-06 18:07:42
【问题描述】:

我对 RMI 很陌生,我只是决定试一试。我对exportObject(Object, int) 方法感到困惑。文档说:

导出远程对象以使其可用于接收传入的 调用,使用特定提供的端口。 对象是用导出的 服务器套接字使用 RMISocketFactory 创建。

考虑以下简单示例:

public interface Client extends Remote {
    void clientMethod() throws RemoteException;
}

public class ClientImpl implements Client {
    public clientMethod() throws RemoteException {
        System.out.println("clientMethod invoked");
    }
}

Client stub = (Client) UnicastRemoteObject
               .exportObject(new ClientImpl(), 56789); //<------ HERE

所以我们创建了一个存根,并将它手动或通过RmiRegistry 传输到另一个VM,在这里无关紧要。

我对“[...] 对象是使用服务器套接字导出的 [...]”感到困惑

这是什么意思?

【问题讨论】:

  • 这意味着服务器端的远程对象将包含一个服务器套接字。您的Client 存根在服务器上拥有一个服务器套接字,在客户端拥有一个客户端套接字。您的 Client 是服务器,除非它是客户端。
  • 现在说真的,你了解Java的ServerSocket吗?它监听传入的 TCP 请求,它是 RMI 在网络级别运行的地方。
  • @E_net4 因此,当我们将存根转移到另一个 VM(VM 0)时,存根将保持与最初创建它的 VM(VM 2)的套接字连接。实际上,VM 2 将维护一个服务器套接字以接受传入的方法调用。对吗?
  • @E_net4 你的第一句话是正确的。但是,您关于在服务器上持有服务器套接字的存根的声明不是。存根在任何地方都没有任何套接字。
  • @EJP 很公平,我把命名法搞砸了。自从我上次使用 Java RMI 已经有一段时间了,我只是想做一个文字游戏。

标签: java rmi


【解决方案1】:
  • 创建一个ServerSocket 以在导出时指定的端口侦听传入连接。该端口可以在多个远程对象之间共享。
  • 关于RMISocketFactory 的说法不正确。你在哪里读到的?此类自 1998 年以来已过时。
  • 存根包含服务器的主机名或 IP 地址和端口号,以及一些用于识别它所属的远程对象的内部数据。
  • 当您调用远程方法时,通过连接池按需创建存根和远程对象之间的 TCP 连接。

因此,当我们将存根转移到另一个 VM(VM 0)时,存根将保持与最初创建它的 VM(VM 2)的套接字连接。

不,见上文。

VM 2 反过来会维护一个服务器套接字来接受传入的方法调用。

正确。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 2012-10-05
相关资源
最近更新 更多