2013-02-18 66 views
0

我想弄清楚最好的方式來遍歷範圍內的所有ips(IE 192.168.5.0-192.168.5.255)來查找正在監聽給定端口的設備。以下代碼正在工作,但我擔心我不會找到所有設備,因爲我的套接字上的超時時間太短。捕捉22是我想這超快,但如果我超時它開始永遠。Android Asynctask套接字掃描

private class findNetworkDevices extends AsyncTask<String, Integer, String> { 

    private String source; 
    private Activity activity; 
    private Context context; 
    public findNetworkDevices(Activity activity) { 
     this.activity = activity; 
     context = activity; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     for (int dest = 0; dest < 255; dest++) { 
      String host = "192.168.5." + dest; // TODO: add net address instead of hardcoding 
      try { 
       Socket s = new Socket(); 
       s.connect(new InetSocketAddress(InetAddress.getByName(host), 9999), 50); 
       Log.v(LOG_TAG, "conn:" + s.toString()); 
       if (s.isConnected()) { 
        Log.v(LOG_TAG, "connected " + host); 
        foundDevicesArray.add(host); 
       } else { 
        return "failed"; 
       } 
      } catch (Exception e) { 
       Log.e(LOG_TAG, "Not found", e); 
      } 
      } 
      Log.v(LOG_TAG, "end"); 

      return "All Done!"; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      super.onProgressUpdate(values); 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      ListView lv = (ListView) activity.findViewById(R.id.foundDevicesList); 
      ((BaseAdapter) lv.getAdapter()).notifyDataSetChanged(); 

     } 
    } 

在此先感謝。

+1

只是一個小優化。你應該讓循環外部的's s'靜態重用,而不是在每個循環中重新創建它。它可能比's.connect()'小,但肯定會使你的代碼更快。 – ilomambo 2013-02-18 18:16:02

回答

0

我離開了使用異步,因爲它花了這麼長時間。我去與執行器服務

 ExecutorService executor = Executors.newFixedThreadPool(NB_THREADS); 
    String ip = getLocalIpAddress(); 
    int endIndex = ip.lastIndexOf("."); 
    String subnet = ip.substring(0, endIndex); 
    for (int dest = 0; dest < 255; dest++) { 
     String host = subnet + "." + dest; 
     executor.execute(pingRunnable(host)); 
    } 

它似乎派生多個線程,其中異步在後臺,但只在一個線程。

+0

Android開發者文檔是否建議使用asynctask來處理任何後臺操作?並且從那裏創建線程來加速進程或者不會直接從主線程調用它們... – miatech 2017-04-03 04:24:58