如何有效ping和发现网络上的所有客户端?

时间:2017-10-29 07:01:08

标签: java android network-programming

我遇到的问题是获取网络上所有可访问的客户端。下面的方法在调用时返回一些客户端。在大多数情况下,其他Android客户端。然而对于PC,它在防火墙打开时失败。是否有更有效的方法来获取Java / android中的所有客户端或者我是否需要使用android NDK?这个领域的专家将提供任何帮助不胜感激。谢谢。

    /***
     *  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 个答案:

答案 0 :(得分:1)

经过研究之后,得到了这个工作。借助这个回购: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();
    }