2012-10-28 41 views
4

在Java程序(使用JNI)中有新連接可用時,Windows操作系統是否有任何方式通知? 目前,我必須檢查這一點的唯一方法是通過輪詢嘗試下載網頁的功能。如果下載成功並且沒有例外,我可以猜測有互聯網連接。當Windows連接到網絡時收到通知

然而,一個更好的解決方案可能是這一個:

  1. 在程序啓動,檢查互聯網連接
  2. 如果沒有可用的Internet連接, 「註冊」 爲Windows網絡通知和wait()
  3. 用戶連接到互聯網時,Windows操作系統通知渣機=>線程醒來
  4. 做一些東西....
+1

似乎與[Windows的網絡接口準備就緒時的通知](http://stackoverflow.com/q/4546878/291641)(儘管不是Java)有關。 [WM_DEVICECHANGE](http://msdn.microsoft.com/en-us/library/windows/desktop/aa363480(v = vs.85).aspx)消息似乎也可能是讓系統通知您這個。 – patthoyts

+0

是的,但如何聽窗口消息?我敢打賭,有一些JNI庫可以做到這一點... –

回答

0

下做平,比下載頁成本更低,並且可以更改超時:

InetAddress.getByName("stackoverflow.com").isReachable(4000) 

放入一個線程循環,在低優先級:

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

我沒有更好。

InetAddress.isReachable文檔:

測試該地址是否可達。嘗試通過 實現嘗試訪問主機,但嘗試訪問主機時會盡最大努力,但防火牆和服務器配置可能會阻止導致無法訪問狀態的請求,而某些特定端口可能是可訪問的。如果可以獲得特權,典型實現 將使用ICMP ECHO請求,否則它將嘗試在目的地主機的端口7(Echo) 上建立TCP連接。

+0

有時防火牆配置爲阻止ICMP消息。 –

+0

'isReachable()'存在已知的問題:http://stackoverflow.com/q/2448666/694576 – alk

+1

@ShashankKadne該方法僅在Unix/Linux下以root權限運行的例外情況下使用ICMP,實際適用。 – EJP