2013-12-18 98 views
0

嗨,我正在開發Java應用程序並部署在Jboss,Windows 8服務器上。在我的服務器代碼中,我使用HttpUrlconnection與我的產品進行通信。由於連接拒絕,Java HttpUrlConnection連接超時不工作

我想爲evey連接設置一個時間限制來連接我的產品。所以我使用HttpUrlconnection.setconnectionTimeout(30000) 30秒的時間限制。但在9分鐘時連接被拒絕。 HttpUrlconnection.setconnectionTimeout()目前無法使用。

我已經發現TCP超時發生的問題,並已在Windows 8服務器中設置了重傳限制。默認情況下,TCP重新傳輸限制爲2.嘗試2次後,連接將被放棄或拒絕。

我的問題是,如何在不更改Windows註冊表文件的情況下從java端避免此問題?這意味着可以設置超時或重試TCP SYN/RST/ACK機制來避免連接被拒絕的問題。

是否有任何人知道,請幫我解決這個問題

url = new URL(requestURL); 
HttpURLConnection connection = (HttpURLConnection) 
url.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setUseCaches(false); 
connection.setDoInput(true); 
connection.setDoOutput(true); 
connection.setConnectTimeout(30000 
connection.setReadTimeout(30000; 

try { 
    // Get Response 
    inputStream = connection.getInputStream(); 
} catch (IOException e) { 
    //    
} 

唯一的例外是下面

java.net.ConnectException: Connection refused: connect 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(Unknown Source) 
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at sun.net.NetworkClient.doConnect(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.<init>(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
+0

是'connection.setConnectTimeout(30000'和'connection.setReadTimeout(30000;'這裏只有錯誤嗎?' – ChiefTwoPencils

回答

0

這連接被拒絕意味着沒有任何程序在連接的另一端聽/希望你的連接。如果您的產品稍後會打開,則需要手動重新嘗試連接;不用等待連接嘗試'流連忘返',以便在程序啓動時連接。老實說,它看起來像你的連接邏輯屁股後退:它看起來像你試圖從長期運行的程序(服務器)連接到短期運行的程序(客戶端);反過來,並讓服務器監聽連接,並且客戶端在啓動時應該連接到服務器。

0

連接超時是針對沒有響應的情況。連接拒絕是一個響應,所以超時不適用。

+0

嗨,我明白了你的觀點,但由於防火牆或其他原因,我無法連接我的設備。那個時候當我調用http請求時,它會在調用java.net.PlainSocketImpl.socketConnect(Native Method)時通過TCP向設備發送SYN數據包,它試圖從設備獲取確認,它只嘗試兩次,因爲Windows註冊的TcpMaxDataRetransmissions爲2。經過兩次失敗,它放棄了請求,所以異常發生了。是否有可能延長重試或延長TCP超時由java? – Murali

+0

我不能使頭部或尾部,我只能重複如果有任何響應在超時之前種類,超時不適用,包括SYN/ACK和RST。 – EJP