<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何正確獲取本地IP?(收藏)

          共 2928字,需瀏覽 6分鐘

           ·

          2021-05-23 23:12

          聊技術(shù),不止于技術(shù)

          在應(yīng)用開發(fā)中我們可能有需要獲取到本地IP地址的需求,今天就來分享兩種獲取本地IP地址的方法。

          1

          獲取本地IP地址有什么用途 ?

          獲取本地IP地址可能有如下兩種用途:
          (1) 運(yùn)維統(tǒng)計功能。通過日志打印本地IP跟一些相關(guān)信息,方便監(jiān)控統(tǒng)計。
          (2) 與第三方系統(tǒng)交互。可能需要帶上我們的本地IP地址信息。


          2

          如何獲取本地IP地址?

          Java可以通過下面一行代碼獲取到IP地址:
          InetAddress.getLocalHost().getHostAddress();
          上面這行代碼其實(shí)做了兩件事,首先獲取到操作系統(tǒng)的hostname,然后根據(jù)hostname獲取本機(jī)IP,實(shí)際返回結(jié)果和 hostname -i 命令返回結(jié)果一樣。
          所以上面的代碼返回結(jié)果依賴于操作系統(tǒng)的 /etc/hosts和 /etc/hostname 兩個文件的設(shè)置。
          那有沒有更好的不依賴于相應(yīng)文件設(shè)置的獲取本地IP地址的方法呢?
          答案是根據(jù)網(wǎng)卡獲取。
          讓我們直接來看代碼和注釋:
          public static String getLocalAddress() {        try {            // 獲取所在機(jī)器上的所有網(wǎng)卡            Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();            ArrayList<String> ipv4Result = new ArrayList<String>();            ArrayList<String> ipv6Result = new ArrayList<String>();            // 遍歷獲取所有網(wǎng)卡綁定的全部IP地址,并按照IPV4和IPV6分開存放            while (enumeration.hasMoreElements()) {                final NetworkInterface networkInterface = enumeration.nextElement();                final Enumeration<InetAddress> en = networkInterface.getInetAddresses();                while (en.hasMoreElements()) {                    final InetAddress address = en.nextElement();                    if (!address.isLoopbackAddress()) {                        if (address instanceof Inet6Address) {                          ipv6Result.add(normalizeHostAddress(address));                        } else {                            ipv4Result.add(normalizeHostAddress(address));                        }                    }                }            }            // 優(yōu)先返回IPV4的非回路和非私有地址            if (!ipv4Result.isEmpty()) {                for (String ip : ipv4Result) {                    if (ip.startsWith("127.0") || ip.startsWith("192.168")) {                        continue;                    }                    return ip;                }                return ipv4Result.get(ipv4Result.size() - 1);            } else if (!ipv6Result.isEmpty()) {                return ipv6Result.get(0);            }            // 如果獲取失敗,降級到根據(jù)localhost獲取地址            final InetAddress localHost = InetAddress.getLocalHost();            return normalizeHostAddress(localHost);        } catch (Exception e) {            log.error("Failed to obtain local address", e);        }        return null;    }
          // 工具方法,規(guī)范IP地址格式 private static String normalizeHostAddress(final InetAddress localHost) { if (localHost instanceof Inet6Address) { return "[" + localHost.getHostAddress() + "]"; } else { return localHost.getHostAddress(); } }
          上述方法可以在絕大多數(shù)情況下正確獲取到本地IP地址,而且不依賴于相應(yīng)的文件配置。




          寫在最后

          今天分享了兩種正確獲取本地IP地址的方法。
          第一種,根據(jù)主機(jī)名來獲取地址的方法,代碼簡單但依賴于操作系統(tǒng)配置。
          第二種,根據(jù)網(wǎng)卡來獲取地址的方法,更加的通用。
          希望今天的內(nèi)容能夠?qū)Υ蠹矣兴鶐椭?/span>

          推薦閱讀:
          《Apache RocketMQ只用了7個類就實(shí)現(xiàn)了Nameserver,你知道是如何做到的嗎?》



          聊技術(shù),不止于技術(shù)。

          在這里我會分享技術(shù)文章、管理知識以及個人的思想感悟,歡迎點(diǎn)擊關(guān)注。

          瀏覽 126
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  а√中文官网在线8 | 天天色天天操天天 | 狠狠干2018 | 不卡的a∨| 免费看国产黄色片网站 |