2012-07-29 67 views
0

我将我的端口扫描器类复制到我的android项目中,而不更改源代码中的任何内容。 Eclipse没有抱怨代码,但我的代码似乎并没有在android中正常工作。这是我的整个portscanner代码。Android项目中的J2ME类

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方法内部类,因为当我手动添加一些端口,它们能打印数组列表,但是当我LAT我的扫描仪添加它们返回总是空的。相同的端口扫描代码在桌面上完美工作。有谁知道我做错了什么?

+0

安置自己的logcat的。 – 2012-07-29 09:56:28

+0

你的意思是1行文字,其中是ID,Appliacation number,Tag等? – 2012-07-29 09:59:23

+0

http://www.appaholics.in/using-the-logcat/ – 2012-07-29 10:00:52

回答

0

不知道,如果它是你有问题,但你要添加的东西到一个ArrayList,这是不是线程安全的,从多个线程,没有任何形式的同步。这会导致不稳定的行为。

而且,你不显示何时以及如何显示该列表的内容。调用代码无法知道扫描何时结束,因此如果您在调用runScanner()后立即要求列表,很有可能没有任何扫描任务已完成执行。顺便说一句,为什么如果你从不使用这个列表将期货添加到期货清单?

+0

我尝试了很多选择,现在我可以肯定地说,失败的事情是套接字测试,任何想法为什么? – 2012-07-29 16:19:07

+0

然后你应该得到一个异常。遵循@ CookChen的建议,并停止忽略例外情况。消息和堆栈跟踪可以给你一个想法。 – 2012-07-29 17:08:35

0

您是否检查过异常?如果在套接字添加到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(); 
     } 
+0

是的,我检查了错误,我不认为有错误将端口添加到列表 – 2012-07-29 12:12:43

+0

你的意思是代码“openPorts.add(port);”已经执行,但你仍然得到一个空的openPorts?如果是这样,我建议你检查添加端口的openPorts是否与你检查的openPorts相同。例如,在添加端口之后立即打印openPorts的大小,并将其打印在getPorts中。 – 2012-07-30 10:54:03

+0

你是否解决了这个问题?我的意思是,你需要检查try块中是否存在异常,而不仅仅是添加端口。我怀疑是否存在妨碍正常过程的例外 – 2012-08-22 08:48:05