java - Java中通过执行ping命令来检测网络上的设备

标签 java android networking ping

我正在尝试通过 ping 每一个设备并检查“可达”值来检测连接到我当前所在网络的设备。下面是负责此操作的代码 fragment ,循环遍历 IP,对它们执行 ping 操作并检查响应:

        for (int i = 1; i <= 254; i++) {
            String addr = IPAddress;
            addr = addr.substring(0, addr.lastIndexOf('.') + 1) + i;
            InetAddress pingAddr = InetAddress.getByName(addr);

            //skips the IP of 'this' device
            if (pingAddr.getHostAddress().equals(IPAddress)) { continue; }

            try {

                //ping command
                Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 -w 1 " + addr);
                boolean reachable = (p1.waitFor() == 0);
                if (reachable) {
                    //add to list, if reachable
                    addrs.add(pingAddr);
                }

            } catch (IOException ex) {
            } catch (InterruptedException ex) {
            }
        }

由于某种原因,这段代码仅检测到某些设备。我有 3 台笔记本电脑、2 台 Android 设备和 1 台 PC 进行测试。其中,它成功检测到 3 台笔记本电脑中的 2 台,均为 Android 设备,但无法检测到 PC。您可以注意到命令中的“-w 1”,我尝试将其设置为 100,唯一的变化是它需要很长时间才能完成,并且仍然找到相同的设备。

我也已经尝试过这个方法:

INetAddress.isReachable(int timeout);

但情况变得更糟,因为 - 至少我发现 - 它使用 TCP echo,并非所有设备都会响应(只有我的 Android 设备会响应)。

此外,ping 速度非常慢。我已经将它分成了 4 个线程,但它仍然可以使用速度提升。

所以,我的最后一个问题是:为什么 ping 命令无法检测到每个设备?您是否可以想到其他方法来实现我的目标?

最佳答案

也许电脑位于防火墙后面?当你手动 ping 它时它有反应吗?

为了获得更好的性能 - 试试这个:

for (int i = 1; i <= 254; i++) {
        String addr = ipLocal;
        addr = addr.substring(0, addr.lastIndexOf('.') + 1) + i;
        InetAddress pingAddr = InetAddress.getByName(addr);

        //skips the IP of 'this' device
        if (pingAddr.getHostAddress().equals(ipLocal)) { continue; }


        String[] command = {"CMD", "/c", "ping -n 1 -w 1 " + addr};
        ProcessBuilder probuilder = new ProcessBuilder(command);
        Process process = probuilder.start();

        InputStream is = process.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;

        while ((line = br.readLine()) != null) {
            CharSequence stats = "Packets: Sent = 1, Received = 1";
            if(line.contains(stats)){
                System.out.println(line);
                System.out.println(addr);
                //add to list, if reachable
                //addrs.add(pingAddr);
            }
        }
    }

关于java - Java中通过执行ping命令来检测网络上的设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41837319/

相关文章:

android - 为什么此代码抛出 NumberFormatException Invalid int : ""?

android - 以编程方式激活 GPS

c - 什么是 linux 中的事件生成以及它们如何生成到进程?

python - 在网络驱动器上安装带有 python win32 扩展的 python

c++ - 我可以使用 sendto() 或 sendmsg() 将数据包推送到服务器的 recvmmsg() 吗?

java - 轴2 : employ inheritance for codegenerated request/response objects

java - 如何重写扩展类的子方法

java - 探索pdf中的水平解析TJ(对tx公式的详细了解)?

java - 在构建 JTree 时,它​​会显示每个节点的路径,有什么方法可以只显示文件/文件夹名称?

android - 如何让SupportMapFragment不填满屏幕高度