我正在尝试开发一个系统,其中有不同的节点运行在不同的系统上或同一系统上的不同端口上
现在,所有节点都创建了一个套接字,其中目标IP是一个称为引导节点的特殊节点的IP。然后节点创建自己的ServerSocket,并开始侦听连接
引导节点维护一个节点列表,并在查询时返回它们
现在我需要的是节点必须将其IP注册到引导节点。当客户端连接到引导节点的ServerSocket时,我尝试使用cli.getInetAddress(),但没有成功
- 我需要客户注册其PPP IP(如果可用)
- 否则,请选择LAN IP(如果可用)
- 否则,它必须注册127.0.0.1,假设它是同一台计算机
使用代码:
System.out.println(Inet4Address.getLocalHost().getHostAddress());
或
System.out.println(InetAddress.getLocalHost().getHostAddress());
我的PPP连接IP地址是:117.204.44.192,但上面返回的是192.168.1.2
编辑
我正在使用以下代码:
枚举e=NetworkInterface.getNetworkInterfaces();
而(e.hasMoreElements())
{
网络接口n=(网络接口)e.nextElement();
枚举ee=n.getInetAddresses();
while(ee.hasMoreElements())
{
InetAddress i=(InetAddress)ee.nextElement();
System.out.println(i.getHostAddress());
}
}
我能够获取所有NetworkInterfaces关联的所有IP地址,但如何区分它们?这是我得到的输出:
127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19
在大多数情况下,这可能有点棘手
从表面上看,InetAddress.getLocalHost()应该为您提供此主机的IP地址。问题是主机可能有很多网络接口,并且一个接口可能绑定到多个IP地址。最重要的是,并非所有的IP地址都能在您的机器或LAN之外访问。例如,它们可以是虚拟网络设备的IP地址、专用网络IP地址等等
这意味着InetAddress.getLocalHost()返回的IP地址可能不是正确的
你怎么处理这件事
- 一种方法是使用
NetworkInterface.getNetworkInterfaces()获取主机上的所有已知网络接口,然后迭代每个NI的地址 - 另一种方法是(以某种方式)获取主机的外部播发FQDN,并使用
InetAddress.getByName()查找主IP地址。(但是您如何获得它,以及如何处理基于DNS的负载平衡器?) - 前一种方法的一个变体是从配置文件或命令行参数获取首选FQDN
- 另一种变体是从配置文件或命令行参数获取首选IP地址
总之,InetAddress.getLocalHost()通常可以工作,但是对于代码在“复杂”网络环境中运行的情况,您可能需要提供一种替代方法
我能够获得与所有网络接口关联的所有IP地址,但如何区分它们
- 127.xxx.xxx.xxx范围内的任何地址都是“环回”地址。它仅对“此”主机可见
- 192.168.xxx.xxx范围内的任何地址都是私有(又名站点本地)IP地址。这些是为在组织内使用而保留的。同样适用于10.xxx.xxx.xxx地址和172.16.xxx.xxx至172.31.xxx.xxx地址
- 169.254.xxx.xxx范围内的地址是链路本地IP地址。这些是为在单个网段上使用而保留的
- 范围224.xxx.xxx.xxx到239.xxx.xxx.xxx的地址是多播地址
- 地址255.255.255.255是广播地址
- 任何其他都应该是有效的公共点对点IPv4地址
事实上,InetAddress API提供了测试环回、链路本地、站点本地、多播和广播地址的方法。您可以使用这些来确定返回的IP地址中哪一个最合适