2016-04-25 181 views
0

發送大量請求到服務器時,我遇到了java.net.SocketException(權限被拒絕:連接)。我嘗試了其他線程中提到的-Djava.net.preferIPv4Stack=true選項。 這個問題只發生在很多連接之後。以下代碼可用於重現問題:java.net.SocketException:權限被拒絕:連接。可能是什麼原因以及如何避免它?

public class Example { 
    public static void main(String[] args) { 
    if(args.length == 1) { 
     System.out.println(args[0]); 
     for(int i = 0; i < Integer.MAX_VALUE; i++) { 
     requestURL(args[0]); 
     } 
    } 
    } 
    public static void requestURL(String targetUrl) { 
    URL url = new URL(targetUrl); 
    HttpURLConnection httpCon = (HttpURLConnection)url.openConnection(); 
    httpCon.setDoInput(true); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(httpCon.getInputStream())); 
    //handle response here 
    rd.close(); 
    httpCon.disconnect(); 
    } 
} 

代碼將成功發送請求,直到發生異常。這已在服務器的日誌文件中得到驗證。

請僅針對允許的服務器運行示例代碼,因爲它會在服務器上產生相當多的通信量/負載。

所以現在的問題是:如何避免這種異常?或者任何解決方法?這裏的實際問題是什麼?

編輯

添加httpCon.disconnect()。 (不解決問題)

編輯#2(堆棧跟蹤)

java.net.SocketException: Permission denied: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.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.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) 
    at sun.net.protocol.http.HttpURLConnection.plainConnect0(Unknown Source) 
    at sun.net.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
    at sun.net.protocol.http.HttpURLConnection.connect(Unknown Source) 
    at Example.requestUrl(Example.java) 
    at Example.main(Example.java) 

當問題發生時沒有進一步的請求被髮送到服務器(無SYN數據包服務器上沒有日誌條目和(用tcpdump嗅探))。

編輯#3

我忘了運行具有-Djava.net.preferIPv4Stack=true參數的應用程序。 它同時使用上述參數和httpCon.disconnect()方法時還沒有引發異常。

+0

您應該發佈堆棧跟蹤。 – javabrett

+0

什麼是確切的例外?它來自您的代碼或連接到的服務器(例如速率限制)? –

回答

1

嘗試使用httpCon.disconnect()確保在完成讀取響應後釋放套接字。

相關問題