【问题标题】:How to set client local endpoint - Java RMI [duplicate]如何设置客户端本地端点-Java RMI [重复]
【发布时间】: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 构成导出远程对象。可能你没有意识到这一点,或者你对“出口”有其他的理解。

标签: java rmi


【解决方案1】:

解决了!问题在于客户端扩展UnicastRemoteObject。 显然我必须在客户端和服务器应用程序中设置属性java.rmi.server.hostname,但在客户端中由于扩展而无法正常工作。 所以我设法通过消除扩展并添加以下代码来解决: UnicastRemoteObject.exportObject(this, port);
这样该属性在客户端上正常工作。

【讨论】:

  • 无论哪种方式,该属性都能正常工作。您的问题出在其他地方。
  • 正如我之前写的,我解决了删除扩展的问题,只有这样程序才能正常工作。我不知道你为什么说一定有另一个原因。无论如何,如您所见,问题已解决。
  • 系统属性和扩展名无关。这就是为什么一定有另一个原因。很可能您没有正确设置属性,或者设置得不够早,正如我在这里多次说过的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2017-01-16
  • 2010-12-21
  • 2011-03-27
  • 2013-12-09
相关资源
最近更新 更多