2011-07-31 63 views
3

我正在編寫一個Java應用程序,它具有通過定期嘗試訪問服務器來檢查它是否連接到互聯網的功能。我的第一個想法是Ping服務器 - 但在Java中實現起來很複雜。所以我重新發送它來發送HTTP HEAD請求,並檢查HTTP響應代碼。我有兩個問題:Ping vs HTTP HEAD

1)HTTP HEAD請求是否與ping一樣「可靠」?平是我的第一個自然選擇,以檢查是否有可用的東西。也許只是因爲在命令行上運行起來非常簡單。

2)如果我向第三方網站發送HTTP HEAD請求以檢查它是否可訪問,是否有一些標準頻率應該發送?例如,如果我每秒發送一次,會不會阻止這些服務,甚至阻止我使用這些服務?

+1

當你說「一個第三方網站」,你是一個擁有的網站還是一些隨機網站?請不要通過ping其他人的網站。這可能會導致[麻煩](http://en.wikipedia.org/wiki/NTP_server_misuse_and_abuse)。 –

回答

5

HTTP HEAD通常比ping更可靠,因爲ICMP連接經常被阻塞,並且HTTP通常是打開的。每秒檢查一次連接情況聽起來相當過分,但這取決於你的用例是什麼第三方網站,你試圖「ping」。

+1

OPTIONS請求更好,因爲它沒有關聯到需要首先查找的資源(以獲取其長度等)。 – pyroscope

4

我無法評論它是否更有效地使用HEAD或嘗試執行諸如放入系統並執行ping操作等操作;但我不認爲他們中的任何一個都是你應該做的解決方案。恕我直言,這是沒有必要輪詢你的連接。有很多情況下連接可能會被丟棄,我不認爲投票會爲減輕問題提供很多幫助。另外,用戶可能會感到煩惱。我知道,如果我正在使用應用程序,然後開始做其他事情,突然之間我從一個我甚至沒有注意到的應用程序中發現「連接失去了第三方錯誤」;我會非常惱火。

如果你的應用程序依賴於一個正在存在的連接,那麼我認爲它適用於使用異常處理程序處理這個問題。我敢打賭,無論您嘗試網絡操作而無法建立連接,您使用的任何API都會拋出某種異常。所以,我會做的是在任何類,你要初始化網絡行動,我會按照這種模式:

try { 
    performNetworkAction(); 
} catch (NoConnectionFoundException e) { 
    // handle the situation here 
} 

您的應用程序不應該能夠確定何時連接丟失,只是如何應對當您嘗試網絡操作並且找不到連接時。

這就是說 - 你仍然可能會不同意我。如果是這種情況,那麼允許/推薦的輪詢頻率可能會記錄在您正在使用的服務的API中。另外,如果來自第三方的資源是靜態的,您應該緩存它,而不是一遍又一遍地重複。

3

我想擴大@Dave's answer,並且評論是不夠的。

  1. 當您失去互聯網連接時,會引發java.io.IOException。看看sub-classes of IOException - UnknownHostException,SocketException和ProtocolException是通常聞到「沒有互聯網連接」的那個
  2. 創建一個處理異常的中心位置(這本身就是一個很好的實踐)。如果你得到了上面提到的任何IOException,請將isInternetAvailable設置爲false。
  3. 而不是輪詢互聯網連接,切換到重試您想要執行的操作。你達到同樣的效果
  4. 使用退避策略 - 指數退避效果很好。例如,第一次失敗後,您等待5秒鐘。第二次失敗後,你等待25秒等等。 Gmail webapp使用此策略。Twitter commons has utility classes for backoff