2013-02-18 1 views
0

주어진 포트에서 수신 대기하는 장치를 찾으려면 범위 (IE 192.168.5.0-192.168.5.255)의 모든 ips를 반복하는 가장 좋은 방법을 찾아야합니다. 다음 코드는 작동하지만 소켓이 너무 작아서 모든 장치를 찾지 못할까 걱정됩니다. 캐치 22는 내가 이것을 매우 빠르 길 원한다.하지만 내가 타임 아웃을하면 영원히 시작된다.안드로이드 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

작은 최적화. 루프 밖에서'Socket s'을 static으로 만들어야합니다. 매 루프마다 그것을 재 작성하는 대신 재사용하십시오. 그것은's.connect()'에 비해서는 작을 수 있지만 코드를 더 빨리 만들 것입니다. – ilomambo

답변

0

너무 오랜 시간이 걸렸기 때문에 Async를 사용하지 않았습니다. 나는 비동기 백그라운드에서 오직 하나 개의 스레드에서 그것을 한 곳에 여러 개의 스레드를 생성하는 것 ExecutorService를

 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

안드로이드 개발자 문서에서는 백그라운드 op 작업에 asynctask를 사용하고 프로세스 속도를 높이기 위해 스레드를 만드는 것이 좋습니다. 그렇지 않으면 주 스레드에서 직접 호출하는 데 아무런 차이가 없습니다 ... – miatech

관련 문제