【发布时间】: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 已经有一段时间了,我只是想做一个文字游戏。