检查java中网络中所有节点的可访问性

时间:2015-03-14 16:13:03

标签: java networking network-programming

我想使用java检查网络中的所有节点可访问性。我已阅读ThisThis问题,我已经通过帮助解决这些问题编写了我的方法,我的网络中至少有两个经过测试的Ips可以访问,其中一个是192.168.1.1和另一个是192.168.1.102您可以在下面的图片中看到192.168.1.1的测试:

enter image description here

Odk但是当我运行我的代码时,我的应用程序说192.168.1.1无法访问。这是图像,我用红色箭头指着它:

enter image description here

好的,这是我的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());
            }

        }
    }

我的代码出了什么问题?

1 个答案:

答案 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也不可靠......

相关问题