我正在尝试开发一个系统,其中有不同的节点在不同的系统或同一系统的不同端口上运行。
现在,所有节点都创建一个带有目标 IP 的套接字作为称为引导节点的特殊节点的 IP。然后节点创建自己的 ServerSocket
并开始监听连接。
引导节点维护一个节点列表并在被查询时返回它们。
现在我需要的是节点必须将其 IP 注册到引导节点。我尝试使用 cli.getInetAddress()
一旦客户端连接到引导节点的 ServerSocket
但这没有用。
- 如果可用,我需要客户端注册其 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
编辑
我正在使用以下代码:
Enumeration e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
NetworkInterface n = (NetworkInterface) e.nextElement();
Enumeration ee = n.getInetAddresses();
while (ee.hasMoreElements())
{
InetAddress i = (InetAddress) ee.nextElement();
System.out.println(i.getHostAddress());
}
}
我能够获得所有关联的所有 IP 地址 NetworkInterface
s,但我如何区分它们?这是我得到的输出:
127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19
原文由 sasidhar 发布,翻译遵循 CC BY-SA 4.0 许可协议
当有多个网络接口时,这种方式很有效。它总是返回首选的出站 IP。目的地
8.8.8.8
不需要可达。Connect
在 UDP 套接字上具有以下效果:它设置发送/接收的目的地,丢弃来自其他地址的所有数据包,并且 - 这就是我们使用的 - 将套接字转移到“已连接”状态,设置其适当的领域。这包括根据系统的路由表检查到目的地的路由是否存在,并相应地设置本地端点。最后一部分似乎没有正式记录,但它看起来像是 Berkeley 套接字 API 的一个不可或缺的特征(UDP“连接”状态的副作用),它在 Windows 和 Linux 中跨版本和发行版可靠地工作。因此,此方法将提供用于连接到指定远程主机的本地地址。没有建立真正的连接,因此无法访问指定的远程 ip。
编辑:
正如 @macomgil 所说,对于 MacOS,您可以这样做: