2012-07-29 32 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