【问题标题】:How to discover host in a WiFi network in Android (JAVA)如何在 Android (JAVA) 中发现 WiFi 网络中的主机
【发布时间】:2016-05-31 14:11:00
【问题描述】:

我正在开发一个 Android 应用程序,我必须发现 WiFi 网络中的每个主机,我已经实现了一个功能,可以“ping”某个网络的 1 到 255 之间的所有 IP 地址。

这个解决方案效果很好,但是有一个问题,执行时间。每次我启动我的应用程序时,我等待大约 256 秒,太长了,我等不及了。

这是我的源代码(我在 Stack 上找到了这个代码,我修改了代码以在我的条件下工作):

public class ScanNetwork {

    ArrayList < String > hosts;

    int i;
    boolean finish = false;
    public ArrayList < String > ScanNetwork(String ipAddress) {

        hosts = new ArrayList < String > ();
        final String subnet = ipAddress.substring(0, ipAddress.lastIndexOf("."));

        for (i = 0; i < 256; i++) {
            String currentHost = subnet + "." + i;
            Process p1 = null;
            int returnVal = 0;
            try {
                p1 = Runtime.getRuntime().exec("ping -w 50 -c 1 " + currentHost);
                returnVal = p1.waitFor();
            } catch (IOException e) {
                System.out.println("Log: " + e.toString());
            } catch (InterruptedException e) {
                System.out.println("Log: " + e.toString());
            }

            boolean reachable = (returnVal == 0);
            if (reachable) {

                if (!hosts.contains(currentHost)) {
                    hosts.add(currentHost);
                    System.out.println(currentHost);

                }
            }
        }
        return hosts;
    }
}

本源代码完美但执行时间过长,有其他方法获取网络中的所有主机吗?

我该如何解决这个问题?

【问题讨论】:

标签: java android networking


【解决方案1】:

我看到的问题是您正在按顺序执行所有 ping - 循环大部分时间都在等待回复。尝试启动几个 AsyncTask,每个 AsyncTask 都有一个指定的地址范围进行搜索,并让它们并行工作。

请注意,对于典型的 192.168.1.x 网络,“.0”(全 0 位)“.255”(全 1 位)将不对应主机,不需要检查。

另外不要忘记,并不是每个人都会响应 ping(这在公司网络中更有可能,在家里则不太可能)

【讨论】:

  • 我的想法是多线程的实现,不同的线程会负责管理许多“扫描”,类似于您的解决方案。但不幸的是,我无法弄清楚如何管理此解决方案的自动线程的创建和终止
  • AsyncTask 将处理线程的创建和终止,以及向/从任务传递信息。例如,您可以传入该线程检查的地址范围,并使用 onProgressUpdate() 或 onPostExecute() 将结果发送回 UI 线程
猜你喜欢
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多