我正在尝试通过 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/