java中的小型ip扫描程序代码

java中的小型ip扫描程序代码,java,networking,ip-address,Java,Networking,Ip Address,我正在用java编写一个小游戏。有一个服务器和一个客户端模块。目前,每个客户端都必须手动输入服务器IP(在本地网络中)。这就是为什么我在这里写了这段代码: import java.net.*; public class myIP { public static void main (String argv[]) { try{ InetAddress ownIP=InetAddress.getLocalHost(); String myIP

我正在用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都很容易,但是因为它是一个由点分隔的字符串,我不知道如何解决:)有什么想法吗


干杯

所以,您需要的是将IPv4地址转换为Int并返回

看看这是否有帮助:


您应该使用
getAddress
返回ip作为字节数组,而不是
getHostAddress

这通常是通过广播/多播来实现的。这不是我玩过的东西,所以不能提供任何代码,但提供了一个很好的解释


编辑:它超越了一个类,您可以使用它。

下面是执行此操作的代码示例

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();
    }
} }
导入java.net.InetAddress;
公共类扫描网{
公共静态void main(字符串[]args)引发异常{
int[]bounds=ScanNet.rangeFromCidr(“192.168.1.255/24”);
for(int i=bounds[0];i(mask-1));//下界
结果[1]=InetRange.ipToInt(原子[0]);//上限
System.out.println(InetRange.intToIp(结果[0]);
System.out.println(InetRange.intToIp(结果[1]);
返回结果;
}
静态类范围{
公共静态int-ipToInt(字符串IP地址){
试一试{
byte[]bytes=InetAddress.getByName(ipAddress).getAddress();
int八位字节1=(字节[0]&0xFF)24;
int-octet2=(ipAddress&0xFF0000)>>>16;
int-octet3=(ipAddress&0xFF00)>>>8;
int-octet4=ipAddress&0xFF;
返回新的StringBuffer()
.append('.').append(八位组3.append('.'))
.append(octet4.toString();
}
} }