簡體   English   中英

android項目中的J2ME類

[英]J2ME class in android project

我將端口掃描程序類復制到了我的android項目中,而不更改源代碼中的任何內容。 Eclipse沒有抱怨代碼,但是我的代碼似乎在android中無法正常工作。 這是我的全部portscanner代碼。

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
}

我以幾種不同的方式測試了我的代碼,並確定只有不正確的是內部類run方法,因為當我手動將一些端口添加到數組列表時,它們會打印,但是當我放置掃描儀時,它們總是返回空的。 相同的端口掃描代碼可在桌面上完美運行。 有人知道我在做什么錯嗎?

不知道這是否是您遇到的問題,但是您正在從多個線程向不是線程安全的ArrayList中添加內容,而沒有任何類型的同步。 這將導致行為不穩定。

此外,您不會顯示如何以及何時顯示此列表的內容。 調用代碼無法知道掃描何時結束,因此,如果您在調用runScanner()之后runScanner()詢問列表,則很有可能沒有任何掃描任務執行完畢。 順便說一句,如果您從不使用此列表,為什么還要將期貨添加到期貨列表中?

你檢查過例外了嗎? 如果在將套接字添加到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();
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM