如何在Android(JAVA)的WiFi网络中发现主机

时间:2016-05-31 14:11:00

标签: java android networking

我正在开发一个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;
    }
}

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

我如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

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

另外请不要忘记并非每个人都对ping做出响应(这更可能发生在企业网络中,而在家中则不那么明显)