当IP地址发生变化时,有没有办法在Java中接收通知?
例如,当计算机从dhcp服务器收到新地址时。我想避免轮询,因为机器已经处于高负荷状态。从我到目前为止发现它似乎是不可能的。
在纯java中运行的东西最好,但是linux特定的方式也可以。
编辑:我应该提到IP地址是本地计算机的IP地址,而不是某些远程服务器。 IE浏览器。我希望在运行java程序的机器的IP地址发生变化时收到通知。
答案 0 :(得分:0)
Linux特定方式:编写shell脚本以监视syslog以获取最近的更改。如果syslog(/ var / log / syslog)发生任何更改,则提取IP地址,或者u可以使用run ifconfig perodically并比较id,IP地址中有任何chage。
答案 1 :(得分:0)
您可以使用此工具生成一个由Java程序获取的触发器:
答案 2 :(得分:0)
我不认为你没有投票就行。问题是,在一般情况下,机器可能有多个IP,这使事情变得复杂。
假设您对用于连接某个已知位置的IP感兴趣(例如某些内部服务器或仅仅是“www.google.com”),那么最简单的方法是打开到该位置的套接字并调用{{ 1}}。这将始终返回正确的IP地址。这个解决方案是跨平台的,易于实现,但如果你真的不需要那种连接,那就有点尴尬了。
另一种方法是解析操作系统的路由表(在linux上运行socket.getLocalAddress()
。这不需要外部连接,但需要(有时是错综复杂的)解析。
概述了第三种更清洁的获取当前IP地址的方法here。但是,当程序在具有多个公共IP的计算机上运行时,或者具有多个私有地址且没有公共地址的计算机上运行时,它会出现问题。通过这种方法,您最终会在这种情况下猜测IP,而您可能并不总是正确的。但是,如果您知道要监视哪个地址,或者知道接口名称,那么这是迄今为止最好的解决方案。
答案 3 :(得分:-1)
试试这个:
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;
}
}
你应该在一个单独的Thread中运行这个循环,并将while(true)更改为一个布尔字段,你可以从线程外部进行管理