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

标签 java networking network-programming

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

enter image description here

奇怪,但是当我运行代码时,我的应用程序说 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());
            }

        }
    }

我的代码有什么问题吗?

最佳答案

问题是 .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/

相关文章:

c# - 将控制台聊天程序转换为 GUI

java - 如何在Play Framework中自动更新数据 View ?

java - LAN 网络和 ZONG 4G 上的 IP 地址返回不同

c - 使用 IPv6 进行套接字编程,其中客户端和服务器程序驻留在不同的计算机上

java - 通过专用网络访问服务器

c# - 通信协议(protocol)的可维护性 - 重叠或单独的请求?

python - 在 Windows 上的 select.select 中使用 sys.stdin

java - 将位图与标准 Java 合并

java - 创建对象时如何增加对象数组?

java - 线程安全框架