我想使用 java 检查网络中所有节点的可访问性。我已阅读This和 This问题,我已经通过帮助这些问题编写了我的方法,我的网络中至少有两个经过测试的IP可以访问,其中一个是192.168.1.1
,另一个是192.168.1.102
您可以在下图中看到192.168.1.1
的测试:
奇怪,但是当我运行代码时,我的应用程序说 192.168.1.1 无法访问。这是图像,我用红色箭头指向它:
好的,这是我的java代码:
private void checkNetworkAccessibility(){
int timeout = 1000;
String subnet = firstSubnet.getText() + "." + secondSubnet.getText() + "." + thirdSubnet.getText() + ".";
DefaultTableModel model = (DefaultTableModel)networkTable.getModel();
for(int i=1;i<=254;i++){
try {
if(InetAddress.getByName(subnet+i).isReachable(timeout)){
model.addRow(new Object[]{subnet + i, subnet + i, "بله", "بله"});
}
else{
model.addRow(new Object[]{subnet + i, "نامشخص", "خیر", "بله"});
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
我的代码有什么问题吗?
最佳答案
问题是 .isReachable()
不可靠。它的实现完全依赖于操作系统!
我们以Linux为例;此方法使用 echo TCP 服务(端口 7)。您真的知道今天有一台服务器正在运行吗?我不知道。
无法使用 ping;看看这个:
$ ls -l $(which ping)
-rwsr-xr-x 1 root root 44168 May 7 2014 /bin/ping
是的,没错;粘性位。原因是 ping 命令沿线路发送 ICMP 回显请求数据包,这要求您能够访问原始套接字。
除非您拥有必要的权限,否则您无法做到这一点,并且在 Java 中您也无法做到这一点!除非您使用 native 库。并且您以必要的权限运行。这通常意味着您需要成为管理员。这是你不想要的。
当然,系统管理员甚至可能决定阻止主机上传入的回显请求数据包,因此即使 ping
也不可靠......
关于java - 在java中检查网络中所有节点的可访问性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29051124/