前言
本文接着上文的内容,主要解答上文留下的疑问:既然不能使用InetAddress#getLocalHost()直接去获取到本机的IP地址,那么如何破呢?
本文将介绍的是一种通用的获取本机IP地址的解决方案,也就是所谓的“正确姿势”。
正文
为了更好的解释为何InetAddress#getLocalHost()不靠谱,有必要先普及下Linux下的相关文件的解释,比较我们的Java应用绝大部分情况下都是跑在Linux环境下的(甚至国内基本都跑在centos上吧)。
Linux下/sysconfig/network、hosts、host.conf、resolv.conf文件解释
这几个文件都位于/etc/目录下,下面分别给出解释和示例:
/sysconfig/network:此文件是针对本计算机的,是给计算机起的一个名字,是计算机的一个标识。可以使用uname -n 命令来查看本地计算机的计算机名称(比如本例我使用该命令得到的值是l-xxx.syc.prod.ali.qr,也就是配置里的HOSTNAME的值)
支持网络通信
NETWORKING=yes
主机名,若你不设置默认是localhost.localdomain
使用hostname命令查看到的就是这个值
HOSTNAME=l-xxx.syc.prod.ali.qr
不启用IPV6的支持
NETWORKING_IPV6=no
PEERNTP=no
hosts:不同于network,此文间是在网络上使用的。和Windows系统下的hosts文件相类似,就是一个文本文件,里面存放一些IP和域名的对应关系(注意:都是先ip,后域名)
127.0.0.1 localhost
::1表示的时ipv6的本地地址,也就是0000:0000:0000:0000:0000:0000:0000:0001
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
内网ip地址 -> 主机名 的映射关系
10.102.1.153 l-xxx.syc.prod.ali.qr
host.conf:解析顺序/方式,属于一种规则配置。
这里规定先使用DNS来解析域名,然后再查询“/etc/hosts”文件(也可以相反,你调个顺序即可)
order bind,hosts
指定是否“/etc/hosts”文件中指定的主机可以有多个地址
multi on
resolv.conf
:
DNS
服务器
的配置文件
,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序。该文件由
域名解析
器
来读取(下面会有Java代码示例)
格式:每行以一个关键字开头,后接一个或多个由空格隔开的参数
可选的关键字有:
nameserver:(最重要,此关键字必选,其它可选)定义DNS服务器的IP地址,可以有很多行的nameserver,每一个带一个IP地址。在查询时就按nameserver在本文件中的顺序进行,且只有当第一个nameserver没有反应时才查询下面的nameserver。
domain:定义本地域名/主机的域名
search
:定义域名的搜索列表<