2011-06-20 35 views
2

現在我這樣做:Java套接字:重試連接拒絕異常的最佳方法是什麼?

while (true) { 
    try { 
     SocketAddress sockaddr = new InetSocketAddress(ivDestIP, ivDestPort); 
     downloadSock = new Socket(); 
     downloadSock.connect(sockaddr); 
     this.oos = new ObjectOutputStream(downloadSock.getOutputStream()); 
     this.ois = new ObjectInputStream(downloadSock.getInputStream()); 
     break; 
    } catch (Exception e) {} 
} 

downloadSock.connect(sockaddr)會產生ConnectionRefused異常,如果遠程主機沒有在插座上聽。我在單獨的線程中運行我的代碼,所以我不擔心阻塞。鑑於此,我的方法是重試適當還是有更好的方法?

謝謝!

+2

您也可能要考慮的HttpClient(見http://hc.apache.org/httpcomponents-client-ga/tutorial/html/ fundamentals.html#d4e292)。這會爲你節省很多代碼。 – joeslice

回答

2

在這種情況下,我通常使用逐漸增長的每個請求的睡眠週期。

可能是因爲服務器已經快到了,所以你只是想再試一次。但如果該請求失敗,請等待2秒鐘,但如果該請求失敗,請等待4等。

可能是您想要等待30秒或一分鐘或類似的數量。定義最大嘗試次數可能是明智的,所以您不要無限期地等待。

像這樣的東西可能會計算你的下一個延遲秒數:

seconds_to_wait = Math.min(60, Math.pow(2, try_num)); 
3

可以嘗試連接到遠程服務器,但實際上很常見,但要確保在每次迭代中有一個Thread.sleep(ms),或者服務器主機可能認爲您正在嘗試使用DOS

1

您的方法將一個接一個地連接請求連接到服務器。您應該在catch區塊中包含Thread.sleep()呼叫(因此只有在您實際需要等待時纔會執行),以便在再次嘗試之前等待幾秒鐘。

相關問題