Java 当IP地址更改时接收通知

Java 当IP地址更改时接收通知,java,Java,有没有一种方法可以在IP地址更改时接收Java通知 例如,当机器从dhcp服务器接收到新地址时。我希望避免轮询,因为机器已经处于重载状态。从我目前的发现来看,这似乎是不可能的 在纯java中工作的东西最好,但linux特定的方式也可以 编辑:我应该提到IP地址是本地机器的IP地址,而不是某个远程服务器的IP地址。例如,当运行java程序的计算机的IP地址发生更改时,我希望收到通知。尝试以下操作: InetAddress old = InetAddress.getLocalHost(); whil

有没有一种方法可以在IP地址更改时接收Java通知

例如,当机器从dhcp服务器接收到新地址时。我希望避免轮询,因为机器已经处于重载状态。从我目前的发现来看,这似乎是不可能的

在纯java中工作的东西最好,但linux特定的方式也可以

编辑:我应该提到IP地址是本地机器的IP地址,而不是某个远程服务器的IP地址。例如,当运行java程序的计算机的IP地址发生更改时,我希望收到通知。

尝试以下操作:

InetAddress old = InetAddress.getLocalHost();
while(true) {
    InetAddress new = InetAddress.getLocalHost();
    if(!old.toString().equals(new.toString())) {
        System.out.println("IP has changed to: " + new.toString());
        System.out.println("IP was: " + old.toString());
        old = new;
    }
}

您应该在一个单独的线程中运行这个循环,并将whiletrue更改为一个布尔字段,您可以从线程外部管理该字段,具体方法是:编写一个shell脚本来监视syslog的最新更改。如果syslog/var/log/syslog有任何更改,请提取IP地址,或者您可以使用run-ifconfig Periodically并比较IP地址中有任何更改的id。

您可以使用此工具生成由Java程序拾取的触发器:


我认为你不会在没有投票的情况下做这件事。问题是,在一般情况下,机器可能有几个IP,这使事情变得复杂

假设您对用于连接到某个已知位置(例如某个内部服务器或www.google.com)的IP感兴趣,最简单的方法是打开该位置的套接字并调用socket.getLocalAddress。这将始终返回正确的IP地址。这个解决方案是跨平台的,很容易实现,但是如果你真的不需要这种连接,就有点尴尬了

另一种方法是在linux run route-en上解析操作系统的路由表。这不需要外部连接,但有时需要复杂的解析


第三种更干净的方法是获取当前IP地址。但是当程序运行在一台有多个公共ip的机器上,或者一台有多个私有地址但没有公共地址的机器上时,就会出现问题。使用这种方法,在这种情况下,您最终会猜测IP,并且您可能并不总是正确的。但是,如果您知道要监视哪个地址,或者知道接口名称,这是目前为止最好的解决方案。

您的限制是什么?也许像DynDNS这样的东西,或者使用固定IP可以帮助你。限制是机器的IP地址可能会改变,我无法控制它。我的目标只是在屏幕上显示它。但我需要地址是最新的。每秒钟检查一次就足够了,但在while循环中检查某些内容违背了我的编程原则:但在循环中检查是最简单的方法。第一步是解决你的问题,然后你可以寻找更好的解决方案。大多数时候,你不需要更好的解决方案,这是一个糟糕的解决方案。机器可能有多个IP,更改的IP可能与getLocalHost返回的IP不同