0

ソースコードを何も変更せずに、ポートスキャナークラスを Android プロジェクトにコピーしました。Eclipse はコードについて不平を言うことはありませんでしたが、私のコードは Android で正しく動作しないようです。これが私のポートスキャナーコード全体です。

import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;


public class PortScanner {

    private final String ip;
    private final int sPort, ePort, timeout, poolSize;
    private ArrayList<Integer> openPorts = new ArrayList();
    private final ExecutorService es;
    private Collection<Future<?>> futures = new LinkedList<>();


    public PortScanner(String ip, int sPort, int ePort, int timeout, int poolSize) {
        this.ip = ip;
        this.sPort = sPort;
        this.ePort = ePort;
        this.timeout = timeout;
        this.poolSize = poolSize;
        es = Executors.newFixedThreadPool(this.poolSize);

    }

    public ArrayList<Integer> getPorts() {
        return openPorts;
    }

    public void runScanner() {

        for (int startPort = sPort; startPort <= ePort; startPort++) {
            futures.add(es.submit(new Check(ip, startPort, timeout)));
        }

        es.shutdown();

    }

    private class Check implements Runnable { //  BEGININ OF INNER CLASS

        private String ip;
        private int port, timeout;

        private Check(String ip, int port, int timeout) {
            this.ip = ip;
            this.port = port;
            this.timeout = timeout;
        }

        @Override
        public void run() {

            try {
                Socket socket = new Socket();
                socket.connect(new InetSocketAddress(ip, port), timeout);
                socket.close();
                openPorts.add(port);
            } catch (Exception ex) {
            }
        }
    }                                       // END OF INNER CLASS
}

私はいくつかの異なる方法でコードをテストしましたが、正しく動作しないのは内部クラスの実行メソッドだけであると確信しています.配列リストにいくつかのポートを手動で追加すると印刷されますが、スキャナーを追加すると常に返されます.空の。同じポート スキャン コードは、デスクトップで完璧に機能します。誰かが私が間違っていることを知っていますか?

4

2 に答える 2

0

例外を確認しましたか?ソケットが openPorts に追加される前に例外がスローされた場合、空の配列リストが返されます。また、例外がキャッチされたときに例外スタックを出力しませんでした。例外 -catch でエラー ログを出力するのを忘れた場合にも、同様の問題が発生します。

        try {
            Socket socket = new Socket();
            socket.connect(new InetSocketAddress(ip, port), timeout);
            socket.close();
            openPorts.add(port);
        } catch (Exception ex) {
            //It's better to do something at least print an error log
            ex.printStackTrace();
        }
于 2012-07-29T11:06:44.820 に答える
0

それが問題かどうかはわかりませんが、スレッドセーフではない ArrayList に、同期を行わずに複数のスレッドから追加しています。これにより、不安定な動作が発生します。

また、このリストの内容をいつ、どのように表示するかは示していません。呼び出しコードはスキャンがいつ終了するかを知る方法がないため、 が呼び出された直後にリストを要求するrunScanner()と、スキャン タスクの実行がまだ完了していない可能性が高くなります。ところで、このリストを使用しないのに、なぜ先物のリストに先物を追加するのですか?

于 2012-07-29T10:02:55.717 に答える