在Java中如何从给定的IP地址获取下一个IP地址?

4

大家好,

我正在寻找一个Java代码片段,可以根据给定的IP地址获取下一个地址。

例如:getNextIPV4Address("10.1.1.1") 返回 "10.1.1.2"

虽然可以进行字符串处理,但可能会变得混乱。有没有更加规范化的方法来完成这个任务呢?

谢谢您的时间。

7个回答

8
我正在寻找一个Java代码片段,它可以给出给定IP的下一个地址。
这里是一个代码片段:
public static String getNextIPV4Address(String ip) {
    String[] nums = ip.split("\\.");
    int i = (Integer.parseInt(nums[0]) << 24 | Integer.parseInt(nums[2]) << 8
          |  Integer.parseInt(nums[1]) << 16 | Integer.parseInt(nums[3])) + 1;

    // If you wish to skip over .255 addresses.
    if ((byte) i == -1) i++;

    return String.format("%d.%d.%d.%d", i >>> 24 & 0xFF, i >> 16 & 0xFF,
                                        i >>   8 & 0xFF, i >>  0 & 0xFF);
}

示例输入/输出 (ideone.com演示):

10.1.1.0        -> 10.1.1.1
10.255.255.255  -> 11.0.0.0
10.0.255.254    -> 10.1.0.0

那个函数不会返回.254地址的子网地址吗?192.168.0.254 -> 192.168.1.0? arr[index] = "0" 应该改为 arr[index] = index == 3 ? arr[index] = "1" : arr[index] = "0";,对吧? - Till
这取决于您如何定义“下一个”IP地址 :-) - aioobe
确实如此。也许我太过假设他需要可用的IP地址了 :) - Till
@Till 哈哈,是啊。那就太过于假设了 ;) ...开玩笑的。已更新答案。 - aioobe

4

IP地址不是“顺序的”,因此我怀疑你会找到一个库来为你做这件事。


4
这将帮助您入门(添加错误处理、边角情况等):
public static final String nextIpAddress(final String input) {
    final String[] tokens = input.split("\\.");
    if (tokens.length != 4)
        throw new IllegalArgumentException();
    for (int i = tokens.length - 1; i >= 0; i--) {
        final int item = Integer.parseInt(tokens[i]);
        if (item < 255) {
            tokens[i] = String.valueOf(item + 1);
            for (int j = i + 1; j < 4; j++) {
                tokens[j] = "0";
            }
            break;
        }
    }
    return new StringBuilder()
    .append(tokens[0]).append('.')
    .append(tokens[1]).append('.')
    .append(tokens[2]).append('.')
    .append(tokens[3])
    .toString();
}

测试用例:

@Test
public void testNextIpAddress() {
    assertEquals("1.2.3.5", nextIpAddress("1.2.3.4"));
    assertEquals("1.2.4.0", nextIpAddress("1.2.3.255"));
}

3

IP地址实际上只是一个32位整数。根据存储方式的不同,可能可以简单地增加这个基础值。但是考虑到子网、不同的地址类等因素,这种方法可能不太可靠。

正如dty所指出的那样,IP地址并不是顺序的,所以我想不会有任何一种“正式”的方法来做到这一点。


1

. 拆分,将最后一个元素转换为整数并将其递增。检查其值是否小于254,否则您将赢得广播地址。祈祷您始终处理完整的C类子网。


0
如果可以使用第三方库,Guava 可以用来获取下一个(或任何一个)IP地址,如下所示:
InetAddress a = InetAddresses.forString("192.168.1.1");
int i = InetAddresses.coerceToInteger(a);
InetAddress b = InetAddresses.fromInteger(i+1);
String s = InetAddresses.toAddrString(b);
System.out.println(s);

0

将字符串按 "." 分割,并将 4 个字符串转换为字节。将所有字节相乘以获得整数乘积。增加结果。通过除以整数并在每个字节中存储模数来恢复字节。将字节转换为字符串并连接所有字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接