0

コードに問題があります。コードはゲートウェイ/サブネットを見つけようとしています。プログラムがゲートウェイ/サブネットを見つけた場合、それを「call()」メソッドと呼ばれるクラスに返します。その部分は正常に機能しますが、問題はゲートウェイのIDを渡したいことです(ゲートウェイが192.168.1.1であったかどうかはわかりますが、確立れたゲートウェイのベクトルを満たすクラスにも番号1を渡します)。問題は、何らかの理由でゲートウェイのIDを保持するベクトルが空であるということです。問題を解決する方法を教えてください。よろしくお願いします。プロジェクトで使用したコードは次のとおりです。

int GateWayKey = 1;
int GateWayKeyStop=254;
String ip="";
StoredGW FoundedGW = new StoredGW();
int SubNetKey = 2;
int SubNetKeyStop = 254;
Vector <Integer> AllGateWays= new Vector <Integer>();
Vector <Future<String>> AllSQLs = new Vector <Future<String>>();

final int NUM_THREADS = Runtime.getRuntime().availableProcessors(); 
ExecutorService exec = Executors.newFixedThreadPool(NUM_THREADS);
public void run() {


    for (;GateWayKey<=GateWayKeyStop;GateWayKey++){
        ip="192.168."+GateWayKey+".1";
        AllSQLs.add(exec.submit((new PingTask(ip,GateWayKey))));
    }
        AllGateWays = FoundedGW.GiveMeGWs();
    for (int j : AllGateWays){
        for (;SubNetKey<=SubNetKeyStop;SubNetKey++){
            ip="192.168."+j+"."+SubNetKey;         
            AllSQLs.add (exec.submit(new PingTask(ip,null))));
        }
 exec.shutdown();
}

pingを実行してゲートウェイのIDを保存するクラスは次のとおりです。

public class PingTask implements Callable <String> {
String ips; 
int GateWay;
public PingTask (){
}

public PingTask (String ip, int GateWayKey){
    ips=ip;
    GateWay=GateWayKey;
}

public String call(){
    InetAddress address;
    try {
        address = InetAddress.getByName(ips);
        try {
            if (address.isReachable(5000)) { 
                        StoredGW GWs = new StoredGW();
                        GWs.addNewGW(GateWay);
                } else {
                        return null;
                }
            } catch (IOException e) {
                return null;
            }
        } catch (UnknownHostException e) {
            return null;
        }
}
}

これがGateWaysを保存するクラスです

public class StoredGW {
Vector <Integer> AllFoundedGWs= new Vector<Integer>();
public void addNewGW(int i){
    AllFoundedGWs.add(i);
}
public Vector<Integer> GiveMeGWs(){
    return AllFoundedGWs;
}

}
4

1 に答える 1

3

問題はここにあります:

StoredGW GWs = new StoredGW();
GWs.addNewGW(GateWay);

新しい StoreGW を (ローカル変数として) 作成し、それを破棄します。代わりに、 を使用しFoundedGWます。タスクに可視であることを確認する必要があります。タスク内で使用できるように、コンストラクター引数として渡す必要がある場合があります。

これを試して:

public class PingTask implements Callable <String> {
    String ips; 
    int GateWay;
    StoredGW store;

    public PingTask (){
    }

    public PingTask (String ip, int GateWayKey, StoredGW store){
        ips=ip;
        GateWay=GateWayKey;
                    this.store = store;
    }

    public String call(){
        InetAddress address;
        try {
            address = InetAddress.getByName(ips);
            try {
                if (address.isReachable(5000)) { 
                            store.addNewGW(GateWay);
                    } else {
                            return null;
                    }
                } catch (IOException e) {
                    return null;
                }
            } catch (UnknownHostException e) {
                return null;
            }
    }
}

次に、次のように呼び出すことができます。

AllSQLs.add(exec.submit((new PingTask(ip,GateWayKey, FoundedGW))));

無関係な補足として、Java 命名規則の標準 を確認する必要があります。これにより、他の人がコードを理解しやすくなります。

于 2013-01-18T12:25:11.060 に答える