我正在尝试开发仅供个人使用的Android应用。目的是使用我的移动设备发现连接到我的家庭网络的所有设备,并获得任何额外的延迟。我正在使用InetAddress.isReachable()
,它总是返回false。
还有其他帖子以一种或另一种形式问同样的问题。但是,答案已有多年历史,并提出了对我不起作用的解决方法。希望现在的情况比几年前好。一个常见的答案是避免使用InetAddress.isReachable()
,而是连接到常用端口。就我而言,这些设备是简单的家用设备,例如电视,机顶盒,蓝光播放器,笔记本电脑,平板电脑,台式机,电话等。只能在端口上侦听的设备是NAS,路由器和打印机。我的其他设备均未运行任何“服务器”。尝试在特定的端口(例如80、443、22、21等)上连接对我不起作用。
上下文:
ping
成功地ping通所有设备(包括手机),而无需提升特权。
InetAddress.isReachable()
。一个独立的Java
使用InetAddress.isReachable()
在笔记本电脑上运行的程序成功。有人知道如何使InetAddress.isReachable()
在Android应用中正常工作吗?
谢谢!
以下是台式机独立Java程序的代码段和控制台输出:
public static double sendPingRequest(String ipAddress) throws UnknownHostException, IOException
{
int timeout = 600;
long startTime = 0;
long endTime = 0;
double duration = -99;
InetAddress targetHost = InetAddress.getByName(ipAddress);
startTime = System.currentTimeMillis();
if (targetHost.isReachable(timeout)) {
endTime = System.currentTimeMillis();
duration = (double)(endTime-startTime);
} else {
duration = -1;
}
if (duration > -1 ) {
System.out.println();
System.out.print("Ping " + ipAddress + ": " + duration + " ms");
} else {
System.out.print(".");
}
return duration;
}
C:\Temp>java PingMonitor
Ping Monitor
Ping 192.168.1.1: 1.0 ms
Ping 192.168.1.2: 1.0 ms
Ping 192.168.1.4: 1.0 ms
Ping 192.168.1.111: 1.0 ms
Ping 192.168.1.112: 1.0 ms
Ping 192.168.1.113: 2.0 ms
Ping 192.168.1.115: 7.0 ms
Ping 192.168.1.141: 1.0 ms
Ping 192.168.1.142: 5.0 ms
Ping 192.168.1.143: 2.0 ms
Ping 192.168.1.144: 9.0 ms
Ping 192.168.1.145: 14.0 ms
Ping 192.168.1.146: 7.0 ms
Ping 192.168.1.214: 2.0 ms
Ping 192.168.1.215: 10.0 ms
Ping 192.168.1.216: 2.0 ms
Ping 192.168.1.217: 2.0 ms
Ping 192.168.1.221: 2.0 ms
Ping 192.168.1.223: 2.0 ms
C:\Temp>
下面是android代码。如您所见,它几乎与独立的Java程序相同。当我在Galaxy S9 +上运行该设备时,这对于我网络上的所有设备始终会返回无法访问的状态。
private double sendPingRequest(String ipAddress) throws UnknownHostException, IOException {
int timeout = 1000;
long startTime = 0;
long endTime = 0;
double duration = -2;
InetAddress target;
target = InetAddress.getByName(ipAddress);
startTime = System.currentTimeMillis();
if (target.isReachable(timeout)) {
endTime = System.currentTimeMillis();
duration = (double) (endTime - startTime);
} else {
duration = -1;
}
return duration;
}