2013-02-18 67 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