public static InetAddress getByAddress(byte[] addr)
:在给定原始 IP 地址的情况下,返回 InetAddress 对象。
@Test public void fun1() throws UnknownHostException { InetAddress inet = InetAddress.getByAddress(new byte[]{61, (byte) 135, (byte) 169, 125}); // 若你要获取主机名,就尝试通过网络帮你找,所以一般比较耗时,不建议使用。 找不到就原样输出 // System.out.println("域名:" + inet.getHostName()); // 域名:61.135.169.125 System.out.println("IP地址:" + inet.getHostAddress()); // IP地址:61.135.169.125 }
以上两种方式:通过IP构造一个InetAddress
对象,因此你获取它的IP地址时将不再经过DNS解析。
public static InetAddress getLoopbackAddress()
:1.7新增的方法。获取回环地址
@Test public void fun4() { InetAddress inet = InetAddress.getLoopbackAddress(); System.out.println("域名:" + inet.getHostName()); // 域名:localhost System.out.println("IP地址:" + inet.getHostAddress()); // IP地址:127.0.0.1 }
public static InetAddress getLocalHost()
:获取本机的地址(这个方法需要特别注意的是,在Linux下不要直接使用)
@Test public void fun5() throws UnknownHostException { InetAddress inet = InetAddress.getLocalHost(); System.out.println("域名:" + inet.getHostName()); // LP-BJ4556 System.out.println("IP地址:" + inet.getHostAddress()); // IP地址:2.0.0.137 }
为何是2.0.0.137这个地址?请参考如下截图:
因为我开启了VPN,所以它得到的是VPN这个网络接口的IP地址。但若我把VPN关掉,那返回的就是正常的192.168.199.175。另外,此方法在Linux下使用几乎永远返回127.0.0.1,因为在Linux下它仅仅是去读取了hosts文件的内容,而Linux下的hosts文件一般内容如下
# 这里你若配置为127.0.0.2,那么getLocalHost()就返回127.0.0.2 127.0.0.1 localhost ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.102.1.153 l-xxx.syc.prod.ali.qr
综上原因,生产上请勿直接使用getLocalHost()方法来获取本机IP,请勿直接使用getLocalHost()方法来获取本机IP,请勿直接使用getLocalHost()方法来获取本机IP。
域名只绑定到一个地址上的小问题解答
最后remark添加一个小伙伴咨询我的一个小小小问题,示例代码如下:
public static void main(String[] args) throws UnknownHostException { InetAddress[] addresses = InetAddress.getAllByName("xxx.com -> 公司的内网域名"); for (InetAddress address : addresses) { System.out.println(address.getHostAddress()); } }
他发现不管运行多少次,返回的永远是一个地址值,不禁发问,难道一个内网域名只绑定了一台机器???
其实不是的。一般来说对于微服务体系内的内网域名一般都会解析到你公司的Nginx那台机器,由它负责后端实例的负载均衡(不信你多换几个同类别的内网域名试试,你会发现解析出来的ip地址都是一样的 -> 就是你的那台NG机器地址)。
总结
本篇文章重点介绍了Java中InetAddress的使用,它是对IP地址高层的封装,是我们在进行网络编程中必不可少的一个API。虽然它有两个子类,但其实我们只会使用InetAddress。
本文最后留下一个小问题:生产上并不推荐使用getLocalHost()直接去获取本机的IP地址,而这又是一个比较高频的需求,怎么破呢?此问题留在第二趴解答~