發送大量請求到服務器時,我遇到了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()
方法時還沒有引發異常。
您應該發佈堆棧跟蹤。 – javabrett
什麼是確切的例外?它來自您的代碼或連接到的服務器(例如速率限制)? –