【问题标题】:how to get the next ip address from a given ip in java?如何从java中的给定IP获取下一个IP地址?
【发布时间】:2011-09-11 20:16:37
【问题描述】:

伙计们,

我正在寻找一个 Java 代码 sn-p,它给出了来自给定 IP 的下一个地址。

所以getNextIPV4Address("10.1.1.1") 返回"10.1.1.2"

可以进行字符串处理,但最终可能会变得混乱。有没有更正式的方式来做到这一点。

感谢您的宝贵时间。

【问题讨论】:

    标签: java ip-address ipv4 inetaddress


    【解决方案1】:

    如果使用 3rd 方库没问题,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);
    

    【讨论】:

      【解决方案2】:

      我正在寻找一个 Java 代码 sn-p,它给出了给定 IP 的下一个地址。

      这是一个给你的sn-p:

      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 demonstration):

      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";,不是吗?
      • 取决于你如何定义“下一个”IP地址:-)
      • 确实如此。也许我认为他需要可用的IP地址而假设太多了:)
      • @Till heheh 是的。那将假设太多;) ...jk。更新了答案。
      【解决方案3】:

      这将使您开始(添加错误处理、极端情况等):

      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"));
      }
      

      【讨论】:

        【解决方案4】:

        . 拆分,将最后一个元素转换为 int 并递增它。检查它的值是否小于 254,否则你会为自己赢得一个广播地址。祈祷你一直在处理完整的 C 类子网。

        【讨论】:

          【解决方案5】:

          用“.”分割字符串并将 4 个字符串转换为字节。将所有字节相乘以获得 int 乘法。增加结果。通过除以整数并在每个字节中存储 mod 来恢复字节。将字节转换为字符串并连接所有字符串。

          【讨论】:

            【解决方案6】:

            IP 地址几乎只是一个 32 位整数。根据您存储它的方式,可以简单地增加这个基础值。这可能不是很可靠,但是您必须考虑子网、不同的地址类别等。

            正如 dty 指出的那样,IP 地址不是连续的,所以我不认为有任何“正式”的方式来做到这一点。

            【讨论】:

              【解决方案7】:

              IP 地址不是“连续的”,所以我怀疑你会找到一个库来为你做这件事。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-12-31
                • 2018-10-08
                • 2011-01-28
                • 2015-09-28
                • 2011-07-04
                • 2011-12-26
                • 2010-12-21
                相关资源
                最近更新 更多