我想使用java检查网络中的所有节点可访问性。我已阅读This和This问题,我已经通过帮助解决这些问题编写了我的方法,我的网络中至少有两个经过测试的Ips可以访问,其中一个是192.168.1.1
和另一个是192.168.1.102
您可以在下面的图片中看到192.168.1.1
的测试:
Odk但是当我运行我的代码时,我的应用程序说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());
}
}
}
我的代码出了什么问题?
答案 0 :(得分:1)
问题是.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做什么!除非您使用本机库。并且您拥有必要的权限。这往往意味着您需要成为管理员。你不想要的。
当然,系统管理员甚至可能决定阻止主机上的传入回应请求数据包,因此即使ping
也不可靠......