【问题标题】:small ip scanner code in javajava中的小型ip扫描仪代码
【发布时间】:2011-07-24 16:25:13
【问题描述】:

我正在用 java 编写一个小游戏。有一个服务器和一个客户端模块。目前,每个客户端都必须手动输入服务器 IP(在本地网络中)。这就是我在这里写这段代码的原因:

import java.net.*;


public class myIP {

public static void main (String argv[]) 
{ 
    try{
          InetAddress ownIP=InetAddress.getLocalHost();
          String myIP = ownIP.getHostAddress();
          System.out.println( "IP of my system is := "+ myIP );
        }catch (Exception e){
          System.out.println( "Exception caught ="+e.getMessage() );
        }
      }
}

这段代码返回机器的IP地址。有了这些信息(我自己的 IP 地址),我现在想检查此范围内的其他 IP 地址以自动找到服务器。

现在我不知道如何遍历这个 IP 范围。例如:如果“myIP”是 10.0.0.5,我该如何修改该字符串,以便获得 10.0.0.6?如果它是一个整数值,那么每次加 1 会很容易 - 但由于它是一个字符串 - 由点分隔 - 我不知道如何解决这个问题 :) 有什么想法吗?

干杯

【问题讨论】:

    标签: java networking ip-address


    【解决方案1】:

    这往往是使用广播/多播来实现的。这不是我玩过的东西,所以无法为您提供任何代码,但this link 提供了一个很好的解释。

    编辑:它超越了您可以使用的MulticastSocket 类。

    【讨论】:

      【解决方案2】:

      因此,您需要将 IPv4 地址转换为 Int 并返回。

      看看这是否有帮助:

      http://teneo.wordpress.com/2008/12/23/java-ip-address-to-integer-and-back/

      【讨论】:

        【解决方案3】:

        您应该 getAddress 将 ip 作为字节数组返回,而不是 getHostAdress

        【讨论】:

          【解决方案4】:

          这是来自TechnoJeeves 的代码示例,用于执行此操作。

          import java.net.InetAddress;
          
          public class ScanNet {
              public static void main(String[] args) throws Exception {
              int[] bounds = ScanNet.rangeFromCidr("192.168.1.255/24");
          
              for (int i = bounds[0]; i <= bounds[1]; i++) {
                  String address = InetRange.intToIp(i);
                  InetAddress ip = InetAddress.getByName(address);
          
                  if (ip.isReachable(100)) { // Try for one tenth of a second
                      System.out.printf("Address %s is reachable\n", ip);
                  }
              }
          }
          
          public static int[] rangeFromCidr(String cidrIp) {
              int maskStub = 1 << 31;
              String[] atoms = cidrIp.split("/");
              int mask = Integer.parseInt(atoms[1]);
              System.out.println(mask);
          
              int[] result = new int[2];
              result[0] = InetRange.ipToInt(atoms[0]) & (maskStub >> (mask - 1)); // lower bound
              result[1] = InetRange.ipToInt(atoms[0]); // upper bound
              System.out.println(InetRange.intToIp(result[0]));
              System.out.println(InetRange.intToIp(result[1]));
          
              return result;
          }
          
          static class InetRange {
              public static int ipToInt(String ipAddress) {
                  try {
                      byte[] bytes = InetAddress.getByName(ipAddress).getAddress();
                      int octet1 = (bytes[0] & 0xFF) << 24;
                      int octet2 = (bytes[1] & 0xFF) << 16;
                      int octet3 = (bytes[2] & 0xFF) << 8;
                      int octet4 = bytes[3] & 0xFF;
                      int address = octet1 | octet2 | octet3 | octet4;
          
                      return address;
                  } catch (Exception e) {
                      e.printStackTrace();
          
                      return 0;
                  }
              }
          
              public static String intToIp(int ipAddress) {
                  int octet1 = (ipAddress & 0xFF000000) >>> 24;
                  int octet2 = (ipAddress & 0xFF0000) >>> 16;
                  int octet3 = (ipAddress & 0xFF00) >>> 8;
                  int octet4 = ipAddress & 0xFF;
          
                  return new StringBuffer().append(octet1).append('.').append(octet2)
                                           .append('.').append(octet3).append('.')
                                           .append(octet4).toString();
              }
          } }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-06-12
            • 2013-11-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多