2017-10-29 130 views
0

我遇到的问题是获取网络上所有可到达的客户端。下面的方法在调用时会返回一些客户端。在大多数情况下,其他Android客户端。然而,对于PC它在防火墙打开时失败。是否有一种更有效的方式来获得Java/Android中的所有客户端纯粹或将需要使用android NDK?此域中的专家的任何帮助将谢谢。提前感谢。如何有效地ping和发现网络上的所有客户端?

/*** 
    * ping_JavaStyle(final int j) 
    * uses multi threads to enhance performance 
    * while pinging from 0>j<=255 
    * @param j 
    */ 
    private void ping_JavaStyle(final int j) 
    { 
     new Thread(new Runnable() { // new thread for parallel execution 

      public void run() { 
       try { 
        String testIp = prefix + String.valueOf(j); 
        InetAddress address = InetAddress.getByName(testIp); 
        String output = address.toString().substring(1); 


        if (address.isReachable(3000)) { 
         System.out.println(output + " is on the network"); 
         ipList.add(testIp); 
        } else { 

         if (retest(testIp, 139)) { 
          ipList.add(testIp); 
         } else { 
          System.out.println("Not Reachable: " + output); 
         } 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 


    } 
+1

检查https://github.com/rorist/android-network-discovery/ –

回答

1

研究一些后,得到了这个回购该working.With帮助:https://github.com/stealthcopter/AndroidNetworkTools

下面的代码解决了这个问题:

** RunnableTask.Java 
* Created by Kirk on 10/29/2017. 
*/ 

public class RunnableTask implements Callable<Boolean> { 

private String testIp = ""; 
private Boolean is_Reachable = false; 


public RunnableTask(String testIp) { 
    this.testIp = testIp; 
} 

@Override 
public Boolean call() throws Exception { 
    try { 
     PingResult pingResult = Ping.onAddress(this.testIp).setTimes(1).setTimeOutMillis(1500).doPing(); 

     if (pingResult.isReachable) { 
      is_Reachable = true; 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } 

    return is_Reachable; 

    } 
} 

而且在来电者使用方法:

private static final int NTHREDS = 255; 


    //....... 
     ExecutorService executor = Executors.newFixedThreadPool(NTHREDS); 
     List<Future<Boolean>> thread_Values_list = new ArrayList<>(); 
     for (int i = 1; i <= 255; i++) { 
      final int j = i; 
      try { 
       try { 
        String testIp = prefix + String.valueOf(j); 
        RunnableTask worker = new RunnableTask(testIp); 
        Future<Boolean> submit = executor.submit(worker); 
        thread_Values_list.add(submit); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 


      } catch (Exception e) { 


      } 
     } 
     for (Future<Boolean> finishedThread : thread_Values_list) { 

      String reachable_Ip = ""; 
      try { 
       if (finishedThread.get()) { 
        reachable_Ip = prefix + String.valueOf(finishThread_counter); 
        ipList.add(reachable_Ip); 
       } 

      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } catch (ExecutionException e) { 
       e.printStackTrace(); 
      } 
      finishThread_counter++; 
     } 

     executor.shutdown(); 
    }