java - 如何有效地 ping 并发现网络上的所有客户端?

标签 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();


    }

最佳答案

经过更多研究后,得到了这个工作。在此存储库的帮助下: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();
    }

关于java - 如何有效地 ping 并发现网络上的所有客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46997648/

相关文章:

android - 为 android :authorities in a ContentProvider 使用@string

java - 对由指定字符分隔的字符串部分进行重新排序以反转顺序

c - 绑定(bind)到 ANY 接口(interface)的缺点

java - 使用 javamail 读取 gmail 电子邮件时偶尔出现 javax.mail.FolderClosedException

java - 加密后如何解密?

java - 解析时不四舍五入正常吗?数字格式

java - 有没有办法将wireshark http跟踪导入到java中?

java - 中止通过帖子上传文件

android - 无法将任何客户端添加到您的 Firebase 项目

java - UPnP 打印机设备发现