实现Java IP和子网掩码获取当前网段所有IP的步骤

流程图

flowchart TD
    A(开始)
    B(获取本机IP和子网掩码)
    C(计算网段起始IP)
    D(计算网段结束IP)
    E(获取网段所有IP)
    F(显示网段所有IP)
    G(结束)
    A-->B
    B-->C
    C-->D
    D-->E
    E-->F
    F-->G

步骤说明

  1. 开始
  2. 获取本机IP和子网掩码
  3. 计算网段起始IP:通过将IP地址和子网掩码进行位运算,得到网段起始IP的数值表示。
  4. 计算网段结束IP:通过将网段起始IP的数值表示加上子网内可用IP数量减一,得到网段结束IP的数值表示。
  5. 获取网段所有IP:对于网段起始IP和结束IP之间的每一个IP地址数值表示,将其转换为IP地址字符串表示。
  6. 显示网段所有IP
  7. 结束

代码实现

import java.net.InetAddress;
import java.net.UnknownHostException;

public class IPUtil {
    public static void main(String[] args) {
        String ip = getLocalIP();
        String subnetMask = getSubnetMask();
        String[] segmentIPs = getAllIPsInSegment(ip, subnetMask);

        System.out.println("当前网段所有IP地址:");
        for (String segmentIP : segmentIPs) {
            System.out.println(segmentIP);
        }
    }

    /**
     * 获取本机IP地址
     *
     * @return IP地址字符串
     */
    public static String getLocalIP() {
        try {
            return InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取子网掩码
     *
     * @return 子网掩码字符串
     */
    public static String getSubnetMask() {
        try {
            return InetAddress.getLocalHost().getAddress().toString();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取当前网段所有IP地址
     *
     * @param ip          本机IP地址
     * @param subnetMask  子网掩码
     * @return 网段所有IP地址数组
     */
    public static String[] getAllIPsInSegment(String ip, String subnetMask) {
        int ipInt = ipStrToInt(ip);
        int maskInt = ipStrToInt(subnetMask);
        int segmentStart = ipInt & maskInt;
        int segmentEnd = segmentStart + (~maskInt) - 1;

        String[] segmentIPs = new String[segmentEnd - segmentStart + 1];
        for (int i = 0; i < segmentIPs.length; i++) {
            segmentIPs[i] = intToIpStr(segmentStart + i);
        }

        return segmentIPs;
    }

    /**
     * IP地址字符串转换为int表示
     *
     * @param ip IP地址字符串
     * @return IP地址int表示
     */
    public static int ipStrToInt(String ip) {
        String[] ipArray = ip.split("\\.");
        int[] ipIntArray = new int[4];
        for (int i = 0; i < 4; i++) {
            ipIntArray[i] = Integer.parseInt(ipArray[i]);
        }
        return (ipIntArray[0] << 24) | (ipIntArray[1] << 16) | (ipIntArray[2] << 8) | ipIntArray[3];
    }

    /**
     * IP地址int表示转换为字符串
     *
     * @param ipInt IP地址int表示
     * @return IP地址字符串
     */
    public static String intToIpStr(int ipInt) {
        StringBuilder ipBuilder = new StringBuilder();
        ipBuilder.append((ipInt >>> 24) & 0xFF).append(".");
        ipBuilder.append((ipInt >>> 16) & 0xFF).append(".");
        ipBuilder.append((ipInt >>> 8) & 0xFF).append(".");
        ipBuilder.append(ipInt & 0xFF);
        return ipBuilder.toString();
    }
}

代码说明

  1. getLocalIP()方法获取本机IP地址,通过InetAddress.getLocalHost().getHostAddress()实现。
  2. getSubnetMask()方法获取子网掩码,通过InetAddress.getLocalHost().getAddress().toString()实现。
  3. ipStrToInt()方法将IP地址字符串转换为int表示,通过将每个IP地址段转换为整数,然后进行位运算实现