java:获取本机IP,Linux环境下使用InetAddress.getLocalHost()方法获得127.0.0.1

这篇具有很好参考价值的文章主要介绍了java:获取本机IP,Linux环境下使用InetAddress.getLocalHost()方法获得127.0.0.1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

知道InetAddress.getLocalHost()方法是可以获取本地ip的,但是在mac电脑上执行的时候,偶尔会得到127.0.0.1的输出,这样拿到本地ip很不稳定,感觉就很不靠谱了

InetAddress.getLocalHost()方法获取本地IP不靠谱

代码

    public static void main(String[] args) throws Exception {
        InetAddress addr = InetAddress.getLocalHost();
        System.out.println("Local HostAddress: "+addr.getHostAddress());
        String hostname = addr.getHostName();
        System.out.println("Local host name: "+hostname);
    }

mac上输出
inetaddress.getlocalhost(),Java,Linux,# ----macOrWin,java,tcp/ip,linux,ubuntu,centos

原因

windows环境: 使用InetAddress.getLocalHost()方法看似正常能获得本地ip,实际也有不确定性(多网卡协同工作环境下是不准确的

Java 的InetAddress.java 调用 InetAddressImpl.java 的 public native String getLocalHostName() throws UnknownHostException;来获取本地主机名,是一个系统原生方法和ping hostname 返回的 IP 地址是同一个,并不是 ipconfig 方法得到的 eth0 的IP 地址.

默认情况下本机名是localhost,在host文件中对应的ip是127.0.0.1,所以通过这个函数获取到的ip就是127.0.0.1了

即它就是简单的读取/etc/hosts的内容,所以它默认返回的是127.0.0.1非常的不靠谱,因此本方法十分不建议在生产上使用。

不如我们来看一下 /etc/hosts

inetaddress.getlocalhost(),Java,Linux,# ----macOrWin,java,tcp/ip,linux,ubuntu,centos

/etc/hosts的第一行一般均是:127.0.0.1 localhost,所以返回值是127.0.0.1(倘若你把第一行改为127.1.1.1 localhost,那么它的返回值就是127.1.1.1了)

获取本地IP的靠谱方法

从JDK1.4开始,Java提供了一个NetworkInterface类。这个类可以得到本机所有的物理网络接口和虚拟机等软件利用本机的物理网络接口创建的逻辑网络接口的信息,NetworkInterface可以通过getNetworkInterfaces方法来枚举本机所有的网络接口。我们也可以利用getNetworkInterfaces得到的网络接口来枚举本机的所有IP地址。

NetworkInterface类提供了三个方法可以分别得到网络接口名(getName方法)、网络接口别名(getDisplayName方法)以及和网络接口绑定的所有IP地址(getInetAddresses方法)

代码

windows和linux下通用的获取本机IP的方法

package test;

import java.io.IOException;
import java.net.*;
import java.util.Enumeration;

/**
 * @author yanZhiHang
 * @date 2023/2/2 11:59
 */
public class GetLocalHost {
    public static void main(String[] args) throws Exception {
        InetAddress addr = InetAddress.getLocalHost();
        System.out.println("Local HostAddress: "+addr.getHostAddress());
        String hostname = addr.getHostName();
        System.out.println("Local host name: "+hostname);
        System.out.println("本机ip:" + getIpAddress());
    }

    public static String getIpAddress() {
        try {
            //从网卡中获取IP
            Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();
            InetAddress ip;
            while (allNetInterfaces.hasMoreElements()) {
                NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();
                //用于排除回送接口,非虚拟网卡,未在使用中的网络接口
                if (!netInterface.isLoopback() && !netInterface.isVirtual() && netInterface.isUp()) {
                //返回和网络接口绑定的所有IP地址
                    Enumeration<InetAddress> addresses = netInterface.getInetAddresses();
                    while (addresses.hasMoreElements()) {
                        ip = addresses.nextElement();
                        if (ip instanceof Inet4Address) {
                            return ip.getHostAddress();
                        }
                    }
                }
            }
        } catch (Exception e) {
            System.err.println("IP地址获取失败" + e.toString());
        }
        return "";
    }
}

避坑

注意代码中是返回和网络接口绑定的所有IP地址

⚠️我这边服务器有docker容器,结果根据上述代码获取本地IP的时候,获取的是docker对外的网卡ip,结果导致获取先获取到了docker对外的网卡ip。同时也有可能存在多个网卡,影响获取真正的IP

解决

因为我真实目的是校验输入的IP是否为本机ip,所以只要证明网络接口中的所有IP包含输入的IP即可

改造后的代码

    public static boolean isLocalHost(String localHost) throws Exception {
        try {
            Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();
            while (allNetInterfaces.hasMoreElements()) {
                NetworkInterface netInterface = allNetInterfaces.nextElement();
                if (!netInterface.isLoopback() && !netInterface.isVirtual() && netInterface.isUp()) {
                    Enumeration<InetAddress> addresses = netInterface.getInetAddresses();
                    while (addresses.hasMoreElements()) {
                        InetAddress ip = addresses.nextElement();
                        if (null != ip && ip.getHostAddress().contains(localHost)) {
                            return true;
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("校验IP地址失败:", e.getCause());
            e.printStackTrace();
            throw new Exception(e);
        }
        return false;
    }

参考
java获取本机IP文章来源地址https://www.toymoban.com/news/detail-790707.html

到了这里,关于java:获取本机IP,Linux环境下使用InetAddress.getLocalHost()方法获得127.0.0.1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 银河麒麟(linux 架构aarch64) 获取本机所有IP地址

    环境: 版本:银河麒麟桌面操作系统V10(SP1) 内核:Linux 5.4.18-35-generic CPU:Phytium,D2000/8 终端输入 uname -m 查看 架构 aarch64 在windows 上 和 银河麒麟(linux loongarch64) 使用下面的代码获取IP地址: 银河麒麟(linux) gethostname 获取不到IP地址_程序媛zcx的博客-CSDN博客_银河麒麟查看ip地

    2024年02月11日
    浏览(43)
  • qt-c++进阶1-window、linux下获取本机所有网卡ip信息、根据网卡名获取ip地址。

    例如:第一章 主要是通过qt-c++实现获取本机电脑的网卡信息或者是IP信息 总结c++获取本机网卡信息的方法 第一章:适用于windows操作系统、linux操作系统 用 QHostAddress 解析获取本机 IPV4地址 ; 用 QNetworkInterface 解析获取所有网关信息( IP地址(IPV4和IPV6) 、 子网掩码 、 广播地

    2024年02月13日
    浏览(34)
  • Gin:获取本机IP,获取访问IP

     获取本机IP  获取访问IP 参考来源: go+gin获取本机ip和获取访问ip - 简书

    2024年01月21日
    浏览(26)
  • vue获取本机ip地址

     mounted() {       this.getUserIP((ip)={          console.log(\\\'ip=\\\')          console.log(ip)       })     },    methods: {  getUserIP (onNewIP) {         //获取不到可能是因为chrome浏览器版本过高,需要修改浏览器配置如下         //在chrome地址栏输入:chrome://flags/#enable-webrtc-hide-local-ips-

    2023年04月09日
    浏览(27)
  • python获取本机的IP

    方法一: 通常使用socket.gethostbyname()方法即可获取本机IP地址,但有时候获取不到(比如没有正确设置主机名称),示例代码如下: 方法二: 这个方法获取本机服务器的IP。没有任何的依赖。 而是利用 UDP 协议来实现的,生成一个UDP包,把自己的 IP 放入到 UDP 协议头中,然后从

    2024年02月06日
    浏览(29)
  • vue项目前端获取本机IP

    火狐(FireFox) 删除隐藏IP 浏览器输入 about:config 搜索配置 media.peerconnection.enabled 改为false ( 刷新程序,IP正常显示 ) 谷歌(Chrome) 删除隐藏IP 浏览器输入:chrome://flags/#enable-webrtc-hide-local-ips-with-mdns 把 Anonymize local IPs exposed by WebRTC 设置为 disabled ( 刷新程序,IP正常显示 ) edge浏览器删除隐

    2024年02月08日
    浏览(38)
  • 获取本机外网 IP 的方法

    在 Python 中,可以使用多种方法获取本机的外网 IP 地址。下面我将介绍两种常用的方法:使用第三方 API 和解析网页内容。 方法一:使用第三方 API 有一些提供免费的外部接口(API),可以方便地获取本机的外网 IP 地址。其中一个常用的 API 为 http://ipinfo.io/json。我们可以使用

    2024年02月03日
    浏览(33)
  • JavaScript 如何获取本机IP地址

    获取本机IP地址是前端工程师经常需要处理的问题。JavaScript 有几种方法可以获取客户端的IP地址。下面是三种获取本机IP的方法。 方法1:使用第三方 API 一种获取客户端IP地址的最简单方法是使用第三方API。可以使用一些免费API,例如ipify.org等来获取IP地址。下面的代码片段展

    2024年02月04日
    浏览(41)
  • QT 中获取本机ip的方法

    在使用tcp时绑定自己的端口号时,每次都要手动输入或者在代码编写的时候固定死。就在想有没有便捷的方法,于是我便找到了一种不太美好的解决方法: 这样在我现在的电脑上运行可以自动获取到了。但是每台电脑上,ip地址的顺序可能略有不同,所以程序再换一个机子运行

    2024年02月11日
    浏览(35)
  • Qt 获取本机 ip地址方法 获取客户端ip和端口的方法

    上述函数返回本机所有IPv4的ip地址列表,比如192.168.1.10|192.166.1.95 其它方法=》 获取客户端IP地址:

    2024年02月14日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包