如何获取本机在局域网中的IP地址?

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


如何获取本机在局域网中的IP地址?

1、ipconfig (Windows)
2、ifconfig (Linux)
3、 Java类NetworkInterface (JDK1.4起始)
如果获得当前机器所有的网络接口(包括物理的和虚拟的),然后筛选出表示局域网的那个网络接口,那就可以得到机器在局域网内的 IP 地址。


先熟悉一下NetworkInterface

NetworkInterface 表示一个网络接口,可以是一个物理的网络接口,也可以是一个虚拟的网络接口,而一个网络接口通常由一个 IP 地址来表示。

getNetworkInterfaces()  返回当前机器上所有的网络接口
getInetAddresses()      返回绑定到该网卡的所有的 IP 地址(一个网络接口可以绑定多个 IP 地址,通常一个网络接口只对应一个 IP 地址)
// 获得本机的所有网络接口
Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();

while (nifs.hasMoreElements()) {
    NetworkInterface nif = nifs.nextElement();
    
    // 获得与该网络接口绑定的 IP 地址,一般只有一个
    Enumeration<InetAddress> addresses = nif.getInetAddresses();
    while (addresses.hasMoreElements()) {
        InetAddress addr = addresses.nextElement();
        
        // 只关心 IPv4 地址
        if (addr instanceof Inet4Address) {
            System.out.println("网卡接口名称:" + nif.getName());
            System.out.println("网卡接口地址:" + addr.getHostAddress());
        }
    }
}

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

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

网卡接口名称:eth10
网卡接口地址:10.10.2.129
Windows 平台上

wlan开头    局域网的网络接口
lo          本地回环地址
eth开头     VMware 创建的虚拟地址

方案1:Windows机器上获得局域网 IP 地址

/**
 * Windows 机器上获得局域网 IP 地址
 */
public static InetAddress getLANAddressOnWindows() {
    try {
        Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
        
        while (nifs.hasMoreElements()) {
            NetworkInterface nif = nifs.nextElement();
            
            if (nif.getName().startsWith("wlan")) {
                Enumeration<InetAddress> addresses = nif.getInetAddresses();
                
                while (addresses.hasMoreElements()) {
                    InetAddress addr = addresses.nextElement();
                    if (addr.getAddress().length == 4) { // 速度快于 instanceof
                        return addr;
                    }
                }
            }
        }
    } catch (SocketException ex) {
        ex.printStackTrace(System.err);
    }
    return null;
}


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

网卡接口地址:192.168.1.109

(该方法没有考虑 Windows 平台上有多个网络接口的名称以 “wlan” 开头的情况,比如你的机器连接了 WiFi,然后又使用该机器作为热点 —— 不过很容易对二者进行区分,请有兴趣的读者自己实践)


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

方案2:获取本机IP地址(windows or Linux)

错误使用

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

windows             192.168.199.175
windows开一个     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,亦或开启了与否,都OK

/**
 * 获取本机IP地址
 */
public static InetAddress getLocalHostAddress() {
    try {
        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 只要是回环地址都会返回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;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

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


网卡接口地址:192.168.1.109

你可能感兴趣的:(网络编程,tcp/ip,网络协议,网络)