【发布时间】:2019-05-18 20:28:19
【问题描述】:
所以我有一个非常基本的客户端-服务器程序在我的本地局域网上运行。 该程序包括服务器作为永久监听器,将连接到其 ip 的每个客户端添加到观察者列表并每 5 秒更新一次(客户端扩展 UnicastRemoteObject)。 问题是我不知道为什么客户端使用未知的 ip 地址创建引用。
这是我通常从客户那里得到的,如果我输入System.out.println(this):
RmiClient[UnicastServerRef [liveRef: [endpoint:[192.168.56.1:64199](local),objID:[32218df3:16acc934a0a:-7fff, 8241015111525045915]]]]
我做了一些研究,发现 ip 地址属于我的 VirtualBox Host-Only Newtork 接口,所以当我禁用它时,我得到了正确的信息:
RmiClient[UnicastServerRef [liveRef: [endpoint:[192.168.1.3:64307](local),objID:[1b156947:16acc999fa5:-7fff, 6095931207093481175]]]]
这台机器在我的局域网上的正确 ip 是什么。
我的问题是如何在不永久禁用界面的情况下完成这项工作?
此外,如果我在不同的机器上设置服务器和客户端,当服务器尝试更新客户端时我会收到 RemoteException,因为它尝试联系 192.168.56.1 并且显然失败了。
【问题讨论】:
-
这是 Oracle RMI FAQ 中的 A.1 项。如果默认 IP 地址不是您想要的,您需要在导出任何远程对象之前在您的对象导出 JVM 中设置系统属性
java.rmi.server.hostname。 -
@user207421 你的回答部分正确,因为我已经在任何导出之前在客户端和服务器上设置了属性,问题是客户端扩展
UnicastRemoteObject -
我的 comment 是完全正确的,是否扩展
UnicastRemoteObject与此无关。您必须在导出任何远程对象之前设置属性,并且构造UnicastRemoteObject构成导出远程对象。可能你没有意识到这一点,或者你对“出口”有其他的理解。