如何获取局域网内所有ip_知道ip地址怎么算子网掩码

如何获取局域网内所有ip_知道ip地址怎么算子网掩码在使用Java开发网络程序时,有时候我们需要知道本机在局域网中的IP地址

原文地址:https://segmentfault.com/a/1190000007462741
以下为复盘学习笔记
在这里插入图片描述

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

方式1:执行命令

Windows: Win+Rcmdipconfig
Linux : ifconfig


方式2:解析命令

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


方式3:Java网络编程

Java 在 JDK1.4 的时候添加的一个类: NetworkInterface
Further Reading : What is NetworkInterface does?

getNetworkInterfaces()  返回当前机器上所有的网络接口
getInetAddresses()      返回绑定到该网卡的所有的 IP 地址(一个网络接口可以绑定多个 IP 地址,通常一个网络接口只对应一个 IP 地址)

在这里插入图片描述

[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)

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

错误使用

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

windows             192.168.199.175
windows开一个vpn     2.0.0.137
windows网卡接口      此方法就不好使了

Linux              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地址。 * * <p>此方法通过Java的InetAddress类获取本地主机(本机网络接口)的IP地址,并返回一个字符串形式的IPv4或IPv6地址。 * 如果系统配置有多个网络接口,则可能返回其中一个活跃接口的IP地址。</p> * * @return 本地主机的IP地址,格式为标准的点分十进制表示法(对于IPv4)或冒号分隔十六进制表示法(对于IPv6) * @throws UnknownHostException 如果本地主机名无法解析成IP地址,或者没有可用的网络接口 * @throws SocketException 在某些情况下,如操作系统不允许访问网络接口信息时抛出异常 */
    public static InetAddress fetchLocalIpAddress() 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环回类型地址
                if (!inetAddr.isLoopbackAddress()) { 
   
                    // 优先返回site-local地址
                    if (inetAddr.isSiteLocalAddress()) { 
   
                        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

今天的文章如何获取局域网内所有ip_知道ip地址怎么算子网掩码分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/85589.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注