[英]which hostname or ip is java rmi bind in linux?
我是java rmi的新手。 我有一个关于 rmi 使用的问题。
首先,我创建了一个带有端口的服务器(接口只有一个端口参数)。
this.registry = LocateRegistry.createRegistry(1099);
然后我像这样绑定服务器:
public interface MyRmiService extends Remote {
// return "service name" for example
String getName() throws RemoteException;
}
public void register(MyRmiService service) {
try {
this.registry.rebind(syncDataService.getName(), service);
} catch (RemoteException var3) {
FineLoggerFactory.getLogger().error(var3.getMessage(), var3);
}
}
我的客户代码是这样的:
// linux ip
Registry tempRegistry = LocateRegistry.getRegistry(ip, 1099);
MyRmiService service = (MyRmiService)tempRegistry.lookup("service name");
如果我的机器 ip 与 linux shell 看起来相同,这些代码看起来很好:
[root@node26 ~]# hostname
node26
[root@node26 ~]# hostname -i
192.168.101.26
[root@node26 ~]# hostname -I
192.168.101.26 192.168.122.1 172.17.0.1
如果我使用 192.168.101.26 作为 ip。
但是如果我得到一些像这样的不同的ip:
# for example
[root@a ~]# hostname -I
172.16.5.199 172.17.0.1
[root@iZbp124z80qrl3rd8pk42xZ ~]# hostname -i
10.162.107.99
[root@iZbp124z80qrl3rd8pk42xZ ~]# hostname
iZbp124z80qrl3rd8pk42xZ
它不能正常工作,并且卡在使用lookup
的客户端查找服务中。
通常我想使用172.16.5.199
作为 ip。 但也许 rmi 正在使用10.162.107.99
我无法从客户端 ping。 这个 linux 服务器是否有正确的主机名配置?
然后我很困惑。
LocateRegistry.createRegistry(1099);
叫?registry.rebind(syncDataService.getName(), service);
时使用哪个主机名或 ip 叫?LocateRegistry.getRegistry(ip, 1099);
? 我的问题是,我应该使用什么IP?TLDR:这不是注册表
让你的第一个和第三个问题不碍事
由LocateRegistry.createRegistry
创建的注册表(如通过运行JRE/bin/registry[.exe]
程序创建的注册表)根据您的 JVM 配置侦听 IPv4 的 0.0.0.0 和/或 IPv6 的 ::0 。 这可以在您的操作系统中工作的任何地址(和任何接口)上接收。
LocateRegistry.getRegistry(String[,int])
连接到您指定的任何地址或名称(解析为地址); ([int])
调用InetAddress.getLocalHost()
,它根据上面的 JVM 调度到Inet4AddressImp
或Inet6AddressImpl
中的getLocalHostName()
,但在任何一种情况下,这都是一种本机方法,其实现取决于你的操作系统,包括 Linux 在内的 Unix 在这里或在这里。 正如您所看到的,它们是相同的,因此它总是调用gethostname()
,它应该返回与hostname
程序(没有选项)显示的相同的值; 如果调用失败(返回非零)Java 将替换文字字符串"localhost"
。 然后解析该名称,通常由主机文件和/或 DNS 解析,但可能因操作系统和配置而异; 在正确配置的系统上, gethostname()
将是一个解析为机器有效地址的名称(由hostname -i
显示),而localhost
是特殊情况下始终提供环回地址(对于 IP 版本),它是只有在同一台机器上使用时才有效地址,即不是真正的 RMI。 (正确配置的操作系统也将 localhost 解析为环回,但即使操作系统没有,Java 也会在此处这样做。)请注意,这些都不会查看接口上实际存在的地址( hostname -I
返回的地址)。
这种与注册表的连接运行良好。 您说这是挂起的lookup
调用,并且正在尝试连接到远程服务。 这与您关于registry.rebind(name, remoteobject)
的第二个问题有关——但设置远程对象位置的不是rebind
(或bind
)调用,而是远程对象已经包含其位置。 您使用参数service
时没有显示它来自哪里,特别是它是在哪里创建的,这很重要,因为这样一个对象被创建为包含一个LiveRef
,而 LiveRef 又创建并包含一个TCPEndpoint
,其中包含要使用的名称或地址连接它。
现在TCPEndpoint
中确定名称或地址的代码有点复杂。 最简单的情况是,如果设置了 sysprop java.rmi.server.hostname
,则使用它——并且可以是可解析的名称或字符串形式的地址。 否则,它调用InetAddress.getLocalHost()
,如上面对getRegistry
的描述,默认情况下它使用结果地址,但如果 sysprop java.rmi.server.useLocalHostName
设置为true
它使用名称(即来自gethostname()
),除非名称不包含点(不“看起来像”DNS 名称)它尝试对地址进行反向解析,如果成功则使用该名称; 我不太清楚如果失败会发生什么,我现在不能轻易测试。
因此,对您的问题(但不是您的问题)的简单答案是使用java.rmi.server.hostname
来指定客户端应该用来访问您的服务器的名称或地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.