1

特定のホストのポートをスキャンしようとするクラスを作成しました。

問題は、ランダムな方法で結果が得られるか、w/eが最初に終了することです。

このポートスキャンを実行するために結果が表示されることをどのように確認しますか?

テスト方法(申し訳ありませんがGoogle):

public class SimplePortScanner
{
    public static void main(String[] args)
    {
        for(int i = 78; i < 85; i++)
        {
            new Scanner("google.com", i).start();
        }
    }
}

ポートスキャン方法:

import java.net.*;

public class Scanner extends Thread
{
    private String address;
    private int port;

    Scanner(String address, int port)
    {
        super(address);
        this.address = address;
        this.port = port;
    }

    public void run()
    {
        try
        {
            SocketAddress sa = new InetSocketAddress(address, port);
            Socket socket = new Socket();
            socket.connect(sa, 2000);

            System.out.println("Port in use: " + port);

            socket.close();
        }
        catch (Exception e)
        {
            System.out.println("Port not in use: " + port);
        }
    }
}

私はスレッド番号を作成し、実行された順序で結果を配列に保存することを考えていました(少なくとも私の頭の中でそれをどのように見ているか)。

これを正しく行う方法は?私は糸脱毛をいじっているだけなので、ここで何かをいじっている場合は申し訳ありません...

4

1 に答える 1

2

java.util.concurrent を試す

class Scanner implements Callable<Boolean> {
    ....

    @Override
    public Boolean call() {
        try {
            ....
            return true;
        } catch(Exception e) {
            return false;
        }
    }
}

ExecutorService ex = Executors.newCachedThreadPool();
List<Scanner> tasks = new ArrayList<>();
for (int i = 78; i < 85; i++) {
    tasks.add(new Scanner("google.com", i));
}
List<Future<Boolean>> list = ex.invokeAll(tasks);
for(int i = 0; i < tasks.size(); i++) {
    if (list.get(i).get()) {
        System.out.printf("Port is in use: %d", tasks.get(i).port());
    } else {
        System.out.printf("Port is not in use: %d", tasks.get(i).port());
    }
}
// dont forget to shutdown executor
ex.shutdown();
于 2012-12-21T06:43:27.580 に答える