2016-05-31 64 views
0

我正在開發一個Android應用程序,我必須發現WiFi網絡中的每個主機,我已經實現了一個功能,可以「ping」1和1之間的所有IP地址某個網絡的255個。如何發現Android中的WiFi網絡中的主機(JAVA)

這個解決方案工作完美,但有一個問題,執行時間..每當我開始我的應用程序,我等待大約256秒,它太長了,我不能等待這個時間。

這是我的源代碼(我發現棧這段代碼,我修改了代碼,在我的條件,工作):

public class ScanNetwork { 

    ArrayList <String> hosts; 

    int i; 
    boolean finish = false; 
    public ArrayList <String> ScanNetwork(String ipAddress) { 

     hosts = new ArrayList <String>(); 
     final String subnet = ipAddress.substring(0, ipAddress.lastIndexOf(".")); 

     for (i = 0; i < 256; i++) { 
      String currentHost = subnet + "." + i; 
      Process p1 = null; 
      int returnVal = 0; 
      try { 
       p1 = Runtime.getRuntime().exec("ping -w 50 -c 1 " + currentHost); 
       returnVal = p1.waitFor(); 
      } catch (IOException e) { 
       System.out.println("Log: " + e.toString()); 
      } catch (InterruptedException e) { 
       System.out.println("Log: " + e.toString()); 
      } 

      boolean reachable = (returnVal == 0); 
      if (reachable) { 

       if (!hosts.contains(currentHost)) { 
        hosts.add(currentHost); 
        System.out.println(currentHost); 

       } 
      } 
     } 
     return hosts; 
    } 
} 

此源代碼是完美的,但執行時間過長,還有其他方式獲取網絡中的所有主機?

我該如何解決這個問題?

+0

請參閱本[鏈接](http://stackoverflow.com/questions/ 36277912 /如何對掃描的IP-in-的Android/36278723#36278723)。它可能會幫助你。只需將超時時間從5秒增加到20秒。它將爲您提供本地網絡中的所有「IP」。 –

回答

0

我看到的問題是,您正在按順序執行所有ping操作 - 循環花費大部分時間等待回覆。嘗試啓動一些AsyncTasks,每個AsyncTasks都有一個指定的要搜索的地址範圍,並讓它們並行工作。

請注意,對於典型的192.168.1.x網絡,「.0」(全0位)「.255」(全1位)不會對應主機,也不需要檢查。

而且不要忘了,不是每個人都響應ping(這是更可能在企業網絡中,沒有那麼在家裏)

+0

我的想法是實現多線程,不同的線程會照顧管理大量「掃描」,類似於您的解決方案。但不幸的是,我不知道如何管理此解決方案的自動線程的創建和終止 – Elisa

+0

AsyncTask將處理線程的創建和終止,以及向任務傳遞信息和從任務傳遞信息。例如,您可以傳入此線程的地址範圍來檢查,並使用onProgressUpdate()或onPostExecute()將結果發送回UI線程 –