Java android项目中的J2ME类

Java android项目中的J2ME类,java,android,multithreading,sockets,code-reuse,Java,Android,Multithreading,Sockets,Code Reuse,我将端口扫描程序类复制到我的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

我将端口扫描程序类复制到我的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
}
导入java.net.InetSocketAddress;
导入java.net.Socket;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.LinkedList;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.Future;
公共类端口扫描程序{
私有最终字符串ip;
私人决赛积分运动、ePort、超时、池大小;
private ArrayList openPorts=new ArrayList();
私人最终遗嘱执行人;

private Collection不确定这是否是您的问题,但您正在从多个线程向ArrayList添加内容,而ArrayList不是线程安全的,没有任何类型的同步。这将导致不稳定的行为


此外,您不会显示如何以及何时显示此列表的内容。调用代码无法知道扫描何时结束,因此如果您在
runScanner()之后立即请求列表
已被调用,很有可能扫描任务尚未完成。顺便说一句,如果您从未使用此列表,为什么要将未来添加到未来列表中?

是否检查了异常?如果在将套接字添加到openPorts之前抛出异常,您将得到一个空数组列表。并且您没有打印异常堆栈当我忘记在异常捕获中打印错误日志时,我也遇到了类似的问题

        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();
        }

你的意思是1行文本,其中是ID、应用程序编号、标记等?是的,我已经检查了错误,我认为在列表中添加端口时没有错误。你的意思是代码“openPorts.add(port);”已执行,但您仍然得到一个空的openPorts?如果是,我建议您检查添加端口的openPorts是否与您检查的openPorts相同。例如,在添加端口后立即在中打印openPorts的大小,并在getPorts中打印。您是否修复了此问题?我的意思是,您需要检查是否存在异常在try块中,不仅是添加端口。我怀疑是否存在中断正常进程的异常。我尝试了许多选项,现在我可以肯定失败的是套接字测试,知道为什么吗?那么你应该得到一个异常。按照@CookChen的建议,停止忽略异常。消息和堆栈跟踪可能会失败我有个主意给你。