Java 如何确保我的windows系统已连接到网络

Java 如何确保我的windows系统已连接到网络,java,windows,networking,network-programming,ping,Java,Windows,Networking,Network Programming,Ping,我正在创建一个实用程序,其中还包含连接到我的网络的几个ip地址的列表 我需要创建一个模块,不断刷新该列表,以便该列表中只存在活动IP。 我曾想过通过在每个IP上使用PING并删除无响应的IP来实现这一点 问题是,当我的系统本身未连接到网络时,我不想删除IP,因为在这种情况下,由于明显的原因,所有IP都将被删除 如何确保我的系统已连接到某个网络? 我正在使用Java。 我试过看其他问题,但找不到任何相关的问题 [第1版] IP列表是手动添加的,服务器上还有几个我不需要关心的IP。所以我不能按照下面

我正在创建一个实用程序,其中还包含连接到我的网络的几个ip地址的列表

我需要创建一个模块,不断刷新该列表,以便该列表中只存在活动IP。 我曾想过通过在每个IP上使用PING并删除无响应的IP来实现这一点

问题是,当我的系统本身未连接到网络时,我不想删除IP,因为在这种情况下,由于明显的原因,所有IP都将被删除

如何确保我的系统已连接到某个网络? 我正在使用Java。 我试过看其他问题,但找不到任何相关的问题

[第1版] IP列表是手动添加的,服务器上还有几个我不需要关心的IP。所以我不能按照下面@Hoijf的建议在整个服务器上查找。此外,IP的变化是一致的,这就是为什么我需要不断更新我的列表,以便我们可以替换无响应的服务器/IP

  • 扫描网络并保存处于活动状态的IP
  • 将IP存储在一个数组中,并在该数组上迭代,直到用户选择停止或刷新(返回到步骤1)
  • 显示每个IP的状态

    public class temp
    {
    static ArrayList<InetAddress> history = new ArrayList<InetAddress>();
    static Timer timer;
    static InetAddress add;
    public static void main(String[] args)
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int timeout = 25;
        timer = new Timer(1000, new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
        {
            for(InetAddress ii : history)
            {
                try
                {
                    System.out.println(ii+" >> "+ii.isReachable(timeout));
                } catch (IOException e1){System.out.println(ii+" >>                          Failed");}
            }
        }
    });
    Thread t = new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            while(true)
            {
                try
                {
                    history.add(InetAddress.getByName(br.readLine()));
                } catch (UnknownHostException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        });
        t.start();
        timer.start();
    }
    
    公共类临时
    {
    静态ArrayList历史记录=新建ArrayList();
    静态定时器;
    静态地址添加;
    公共静态void main(字符串[]args)
    {
    BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
    int超时=25;
    计时器=新计时器(1000,新ActionListener()
    {
    @凌驾
    已执行的公共无效操作(操作事件e)
    {
    (地址二:历史)
    {
    尝试
    {
    System.out.println(ii+“>>”+ii.isReachable(超时));
    }catch(IOException e1){System.out.println(ii+“>>失败”);}
    }
    }
    });
    线程t=新线程(新的可运行线程()
    {
    @凌驾
    公开募捐
    {
    while(true)
    {
    尝试
    {
    add(InetAddress.getByName(br.readLine());
    }捕获(未知后异常e)
    {
    //TODO自动生成的捕捉块
    e、 printStackTrace();
    }捕获(IOE异常)
    {
    //TODO自动生成的捕捉块
    e、 printStackTrace();
    }
    }
    }
    });
    t、 start();
    timer.start();
    }
    
    }

  • 问题是,我不想删除IP的时候,我的系统本身是 未连接到网络,因为在这种情况下,所有IP都将 删除原因很明显

    这是一个典型的网络隔离问题。你应该考虑你的LAN仍然在上升的情况(IPCONFIG将显示NIC的状态为UP),但是,你已经失去了Internet连接(在某些上游路由器)。作为一个解决方案,您可以考虑使用一个始终被认为是上升的参考IP /主机。
    因此,您应该在程序中创建一个策略来ping此引用主机,以检查是否应从活动列表中删除该主机。

    谢谢您的回复。问题是,如果连接,我的网络将有1000多个系统,我只需要关心最初手动添加到列表中的现有IP。这是因为我们一次只能使用特定的IP(虚拟服务器的IP),而这些虚拟服务器通常会被删除。这是一个荒谬的安排,但很适合我们组织的某些特定要求。我的问题可能不太清楚,需要更新。好的,然后有一个ip的用户输入方法。然后,您可以将IP保存在文件中,并在以后需要时重新加载它。扫描网络是没有必要的,原则是一样的。#hoijf你所建议的一切都是正确的,只是不适合我的特定用例。不管怎样,正如@sanjayk79所建议的那样,我似乎需要找出一些保证始终处于运行状态的IP,这仍然是一个危险的情况,因为我们的网络是动态的。在JDK中查看是否有API来枚举所有本地网络接口或IP地址。它们存在于操作系统端,但我不了解Java。如果它们存在,请查看机器是否仍分配了预期的IP地址,以及适配器的状态是否仍处于启动状态。另一种方法是通过命令行工具之一查询信息。在windows上,例如
    ipconfig
    。您可以将其作为子流程启动。分析相关信息,查看您的网络适配器是否仍处于连接状态,以及是否分配了IP地址。然而,这可能比直接的Java/OSAPI开销更大。网络隔离问题似乎是这个场景的合法术语。我必须找出一些有保证的IP,并将其用作参考。