在XP上使用isReachable()进行线程子网ping - java

我编写了一个应用程序,该应用程序应该对主机所在的子网中的所有客户端执行ping操作(使用isReachable),但是当它在XP计算机(SP2)上运行时,它无法获取所有主机,我得到了奇怪的结果。它似乎与线程链接在一起,就好像我加入了一个连接并有效地迫使应用程序使用它可以工作的一个线程一样。它在Windows 7和ubuntu linux中无需连接就可以正常工作,因此我对为什么它在XP上失败感到有些困惑。它由两个类组成,现在请张贴它们。对Java来说还很新,所以希望它并不明显。提前致谢。

Main.java

package subnetping;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {
public static void main(String[] args) {
    //Set this to your ip and netmask
    Network myNetwork = new Network("192.168.1.33", 24);
   Thread t = null;
   for(String aHost : myNetwork.getClients()){
       t = new Thread(new pinger(aHost));
       t.start();

//           Following makes it work on XP by forcing wait on thread
//           try {
//               t.join();
//           } catch (InterruptedException ex) {
//               Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
//           }

   }
}
public static class pinger implements Runnable{
    private String host;
    private InetAddress address;
    public pinger(String host){
        this.host = host;
        try {
            address = InetAddress.getByName(host);
        } catch (UnknownHostException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void run(){
        try {
            if (address.isReachable(3000)) {
                System.out.println(host + " reachable");
            } 
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
}

网络.java

package subnetping;

import java.util.ArrayList;
import java.util.List;

public class Network {
private String subnet = "";
private int subnetMask;
private List<String> myClients = new ArrayList<String>();

public Network(String hostIP, int subnetMask){
    this.subnetMask = subnetMask;
    this.subnet = getSubNet(hostIP, this.subnetMask);
    createClients();
}

private String ipToBinary(String ipNumber){
    String[] temp;
    String binOctet1;
    String binOctet2;
    String binOctet3;
    String binOctet4;
    String ipAsBinary;

    temp = ipNumber.split("\\.");
    binOctet1 = padLeftToEight(Integer.toBinaryString(Integer.parseInt(temp[0])));
    binOctet2 = padLeftToEight(Integer.toBinaryString(Integer.parseInt(temp[1])));
    binOctet3 = padLeftToEight(Integer.toBinaryString(Integer.parseInt(temp[2])));
    binOctet4 = padLeftToEight(Integer.toBinaryString(Integer.parseInt(temp[3])));
    ipAsBinary = binOctet1 + binOctet2 + binOctet3 + binOctet4;
    return ipAsBinary;
}

private String binaryToIP(String binaryIP){
    return longToIP(Long.parseLong(binaryIP, 2));
}

private Long ipToLong (String ipNumber){
    String[] temp;

    String binOctet1;
    String binOctet2;
    String binOctet3;
    String binOctet4;
    Long ipAsLong;

    temp = ipNumber.split("\\.");
    binOctet1 = padLeftToEight(Integer.toBinaryString(Integer.parseInt(temp[0])));
    binOctet2 = padLeftToEight(Integer.toBinaryString(Integer.parseInt(temp[1])));
    binOctet3 = padLeftToEight(Integer.toBinaryString(Integer.parseInt(temp[2])));
    binOctet4 = padLeftToEight(Integer.toBinaryString(Integer.parseInt(temp[3])));
    ipAsLong = Long.parseLong((binOctet1 + binOctet2 + binOctet3 + binOctet4),2);

    return ipAsLong;
}

private String longToIP (Long LongIP){
    String binOctet1;
    String binOctet2;
    String binOctet3;
    String binOctet4;
    int intOctet1;
    int intOctet2;
    int intOctet3;
    int intOctet4;
    String fullBin;
    String ipAsString;

    fullBin = padLeftToThirtyTwo(Long.toBinaryString(LongIP));

    binOctet1 = fullBin.substring(0, 8);
    binOctet2 = fullBin.substring(8, 16);
    binOctet3 = fullBin.substring(16, 24);
    binOctet4 = fullBin.substring(24);

    intOctet1 = Integer.parseInt(binOctet1, 2);
    intOctet2 = Integer.parseInt(binOctet2, 2);
    intOctet3 = Integer.parseInt(binOctet3, 2);
    intOctet4 = Integer.parseInt(binOctet4, 2);

    ipAsString = intOctet1 + "." + intOctet2 + "." + intOctet3 + "." + intOctet4;

    return ipAsString;
}

private String padLeftToEight(String octet){
    String paddedOctet = octet;
    if(octet.length() == 8){
        return octet;
    }else{
        for( int i = 1; i <= (8 - octet.length()); i++){
           paddedOctet = "0" + paddedOctet;
        }

        return paddedOctet;
    }
}

private String padLeftToThirtyTwo(String ipNumber){
    String paddedIPNumber = ipNumber;
    if(ipNumber.length() == 32){
        return ipNumber;
    }else{
        for( int i = 1; i <= (32 - ipNumber.length()); i++){
           paddedIPNumber = "0" + paddedIPNumber;
        }

        return paddedIPNumber;
    }
}

private String padRightToThirtyTwo(String ipNumber){
    String paddedIPNumber = ipNumber;
    if(ipNumber.length() == 32){
        return ipNumber;
    }else{
        for( int i = 1; i <= (32 - ipNumber.length()); i++){
           paddedIPNumber = paddedIPNumber + "0";
        }

        return paddedIPNumber;
    }
}

private String getSubNet(String ipNumber, int subnetMask){
    for(int i = 0; i < subnetMask; i++){
        subnet = subnet + ipToBinary(ipNumber).charAt(i);
    }
    return binaryToIP(padRightToThirtyTwo(subnet));
}

private void createClients(){
    long subnetLong;
    long clientRange;

    clientRange = ((long) Math.pow(2L, (32L - subnetMask)) - 2);
    subnetLong = ipToLong(this.subnet);

    for(int i = 1; i <= clientRange; i ++){
        myClients.add(longToIP(subnetLong + i));
    }

}

public List<String> getClients(){
    return myClients;
}
}

参考方案

努力解决ping问题,不仅不能在XP上正常运行,而且在发现的一些主机上isReachable()失败了。这不是理想的解决方案,因为它现在依赖于平台,但仍将运行WMI查询,因此始终与Windows绑定。

感谢您的光临。

Java:找到特定字符并获取子字符串 - java

我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

在Map中,如果我们使用现有键进行修改,则不会获得ConcurrentModificationException - java

我有以下代码,我希望从情况2的情况下抛出ConcurrentModificationException,但它运行成功。据我所知,如果我对地图中的单个键执行相同的操作,则不会抛出异常,因为here但是当我重现这种具有两个案例的多个密钥的场景时,通过新密钥修改。通过现有密钥进行修改。情况1: Map<String,String> mp = new H…

从字符串中提取双精度 - java

从以下字符串:radius: -0.118211 zone 如何提取双精度格式的数字。 参考方案 像这样:String tmpstr = "radius: -0.118211 zone"; String asd[] = tmpstr.split(" "); double dbl = Double.parseDouble…

Java中的Boolean.valueOf(String)和BooleanUtils.toBoolean(String)? - java

我在Boolean.valueOf(String)和BooleanUtils.toBoolean(String)之间有一个不同的问题 。我使用我的应用程序就像代码BooleanUtils.toBoolean(defaultInfoRow.getFolderType())一样,而Boolean.valueOf(defaultInfoRow.getFolderT…

如何在字符串之间添加连字符 - java

我有以下字符串xxxxx,我想添加x-xxxx之类的连字符,如何使用Java? 参考方案 您可以使用String#substring()。String newstring = string.substring(0, 1) + "-" + string.substring(1); 您只需要事先检查string length即可避免Index…