[实践总结] 如何获取本机在局域网中的IP地址?

原文地址:https://segmentfault.com/a/1190000007462741

[Q&A] 什么是局域网? LAN

1・局域网是指在一个相对较小的地理范围内(如一栋建筑、一个办公室或一所学校内部),通过网络设备(如交换机路由器无线接入点)相互连接的一组计算机和设备。
2・局域网的主要目的是资源共享,如文件共享、打印服务、互联网访问共享等。局域网的特点包括传输距离短、数据传输速率快、延迟低等。
3・常见的局域网技术包括以太网(Ethernet)Wi-Fi

[Q&A] 局域网有统一的IP吗?

1・在一个局域网(LAN)中,每台计算机通常被分配一个唯一的IP地址。
2・从外部互联网的角度来看,局域网内的所有设备对外表现出来的IP地址是相同的,这个IP地址称为公共IP地址或者是外网IP地址。这个公共IP地址是ISP(互联网服务提供商)分配给局域网的网关(通常是路由器)的,所有局域网内的设备通过这个网关访问互联网,外部网络看到的只是这个代表整个局域网的单一IP地址。

[Q&A] 什么是广播域?

1・广播域是指在同一个物理网络段上,所有能够直接接收广播消息的设备的集合。
2・通常由一个或一组交换机及其直接连接的设备组成,没有配置VLAN(虚拟局域网)的情况下,一个交换机的所有端口默认属于同一个广播域。

[Q&A] 如何获取本机在局域网中的IP地址?

方式1:执行命令

Windows: Win+Rcmdipconfig -allIPv4地址
Linux : ifconfig

方式2:解析命令

调用本地命令(比如 Windows 上的 ipconfig 命令和 Linux 上的 ifconfig 命令),接着解析本地命令的输出,最后得到本机在局域网内的 IP 地址。

方式3:Java网络编程

Java 在 JDK1.4 的时候添加的一个类: NetworkInterface拓展请转阅 : What is NetworkInterface does?

[Q&A] 获得本机的所有IPV4网络IP

    /**
     * 获取本机所有IPv4网络IP地址。
     * <p>
     * 通过遍历本机的所有网络接口,获取与每个接口关联的IP地址,
     * 并筛选出IPv4类型的地址进行输出。对于无法访问或不存在的网络接口,
     * 方法会忽略并继续尝试下一个接口。
     *
     * @throws SocketException 如果在获取网络接口或其IP地址时发生错误
     */
    public static void getLocalIPv4Address() throws SocketException {
        // 获得本机的所有网络接口
        Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
        while (nifs.hasMoreElements()) {
            NetworkInterface nif = nifs.nextElement();
            try {
                // 获得与该网络接口绑定的 IP 地址
                Enumeration<InetAddress> addresses = nif.getInetAddresses();
                while (addresses.hasMoreElements()) {
                    InetAddress addr = addresses.nextElement();
                    // 只关心 IPv4 地址
                    if (addr instanceof Inet4Address) {
                        System.out.printf("网卡接口名称:%s%n", nif.getName());
                        System.out.printf("网卡接口地址:%s%n", addr.getHostAddress());
                    }
                }
            } catch (Exception e) {
                // 如果某个网络接口抛出异常,继续尝试下一个接口
                if (e.getMessage().contains("no such network interface")) {
                    continue;
                }
                throw e; // 如果是其他类型的异常,重新抛出
            }
        }
    }

网卡接口名称:lo
网卡接口地址:127.0.0.1

网卡接口名称:wlan2
网卡接口地址:192.168.137.1 (即为机器在局域网内的 IP 地址)

网卡接口名称:eth10
网卡接口地址:10.10.2.129

Windows 平台上
wlan开头    表示局域网的网络接口
lo         表示本地回环地址
eth开头     表示VMware 创建的虚拟地址

[Q&A] Java 获取本机IP地址(windows or Linux)

原文链接:https://blog.csdn.net/f641385712/article/details/105233229

错误使用

InetAddress localHost = InetAddress.getLocalHost();
localHost.getHostAddress();

windows             getHostAddress → 192.168.199.175
windows开一个vpn     getHostAddress → 2.0.0.137
可以看到当出现多个网卡接口工作时,windows可能就不好使了

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

推荐方案
此方法不管是windows 还是 Linux,亦或开启了vpn与否,都OK

    // 获取本机IP地址
    // 此方法不管是windows 还是 Linux,亦或开启了vpn与否,都OK
    public static InetAddress getLocalHostAddress() throws SocketException, UnknownHostException {
        InetAddress candidateAddress = null;

        // 获得本机的所有网络接口
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();

        while (networkInterfaces.hasMoreElements()) {
            NetworkInterface nif = networkInterfaces.nextElement();

            // 获得与该网络接口绑定的IP地址,一般只有一个
            Enumeration<InetAddress> addresses = nif.getInetAddresses();
            while (addresses.hasMoreElements()) {
                InetAddress inetAddr = addresses.nextElement();

                // 排除loopback环回类型地址(不管是IPv4还是IPv6 只要是回环地址isLoopbackAddress都会返回true)
                if (!inetAddr.isLoopbackAddress()) {
                    if (inetAddr.isSiteLocalAddress()) {
                        // 如果是site-local地址,就是它了 就是我们要找的
                        // ~~~~~~~~~~~~~绝大部分情况下都会在此处返回你的ip地址值~~~~~~~~~~~~~
                        return inetAddr;
                    }
                    // 若不是site-local地址 那就记录下该地址当作候选
                    if (candidateAddress == null) {
                        candidateAddress = inetAddr;
                    }
                }
            }
        }
        // 如果除了环回地之外无其它地址了,那就回退到原始方案吧
        return candidateAddress == null ? InetAddress.getLocalHost() : candidateAddress;
    }

InetAddress localHostAddress = fetchLocalIpAddress();
System.out.println("网卡接口地址:" + localHostAddress.getHostAddress());

网卡接口地址:192.168.1.109
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值