import java.net.DatagramSocket;import java.net.InetAddress;try(final DatagramSocket socket = new DatagramSocket()){ socket.connect(InetAddress.getByName("8.8.8.8"), 10002); ip = socket.getLocalAddress().getHostAddress();}当存在多个网络接口时,这种方法效果很好。它总是返回首选的出站IP。目的地8.8.8.8不需要是可到达的。
Connect在UDP套接字上具有以下效果:它设置发送/接收的目的地,丢弃来自其他地址的所有数据包,并且-我们使用的是-将套接字转换为“已连接”状态,并设置其适当的字段。这包括根据系统的路由表检查到目的地的路由的存在,并相应地设置本地端点。最后一部分似乎没有正式记录,但看起来像Berkeley套接字API的一个固有特征(UDP“已连接”状态的副作用),可以在Windows和Linux的各个版本和发行版中可靠地工作。
因此,此方法将提供用于连接到指定远程主机的本地地址。没有建立真正的连接,因此指定的远程IP可能无法访问。
编辑:
对于MacOS,你可以执行以下操作:
Socket socket = new Socket();socket.connect(new InetSocketAddress("google.com", 80));System.out.println(socket.getLocalAddress());


