当Windows连接到网络时收到通知

4
有没有办法在Java程序中(使用JNI)接收Windows操作系统通知有新连接可用?目前唯一的方法是通过轮询一个尝试下载网页的函数来检查。如果下载成功且未抛出异常,则可以猜测存在Internet连接。
然而,更好的解决方案可能是:
1. 在程序启动时,检查网络连接情况。 2. 如果没有可用的互联网连接,“注册”Windows网络通知并等待(WAIT())。 3. 用户连接到网络后,Windows操作系统会通知Java机器,线程会被唤醒。 4. 进行一些操作......

1
似乎与Windows上网络接口准备就绪的通知有关,尽管那不是Java。WM_DEVICECHANGE消息也似乎是一个很可能让系统通知您此事的候选项。 - patthoyts
是的,但如何监听Windows消息?我敢打赌有一些JNI库可以做到这一点... - Alberto Geniola
1个回答

0
以下代码执行 ping 操作,比下载页面成本更低,并且您可以更改超时时间:
InetAddress.getByName( "stackoverflow.com" ).isReachable( 4000 )

放置在低优先级的线程循环中:

while( ! InetAddress.getByName( "stackoverflow.com" ).isReachable( 4000 )) {
   Thread.slepp( 1000L );
}

我没有更好的了。

InetAddress.isReachable 文档:

测试该地址是否可达。实现会尽最大努力尝试到达主机,但是防火墙和服务器配置可能会阻止请求,导致不可达状态,而某些特定端口可能是可访问的。典型的实现将使用 ICMP ECHO REQUEST(如果可以获得特权),否则它将尝试在目标主机的 7 号端口(Echo)上建立 TCP 连接。


有时防火墙被配置为阻止 ICMP 消息。 - Shashank Kadne
isReachable() 存在已知问题:https://dev59.com/4HE95IYBdhLWcg3wHqMV - alk
1
@ShashankKadne 这种方法仅在 Unix/Linux 下以 root 权限运行的特殊情况下使用 ICMP,这种情况实际上不应该发生。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接