【问题标题】:Getting notified when Windows connects to a network当 Windows 连接到网络时收到通知
【发布时间】:2012-10-28 08:37:23
【问题描述】:

当有新的连接可用时,在 Java 程序中(使用 JNI)有什么方法可以通知 Windows 操作系统? 目前,我必须检查的唯一方法是轮询尝试下载网页的函数。如果下载成功并且没有抛出异常,那么我可以猜测有 Internet 连接。

但是,更好的解决方案可能是这个:

  1. 在程序启动时,检查互联网连接
  2. 如果没有可用的 Internet 连接,请“注册”Windows 网络通知和 WAIT()
  3. 用户连接到 Internet,Windows 操作系统通知 Java 机器=>线程唤醒
  4. 做一些事情......

【问题讨论】:

标签: java windows networking notifications java-native-interface


【解决方案1】:

下面做一个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 消息。
  • isReachable() 存在已知问题:stackoverflow.com/q/2448666/694576
  • @ShashankKadne 该方法仅在 Unix/Linux 上以 root 权限运行的特殊情况下使用 ICMP,实际上不应该应用。
猜你喜欢
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多