2016-04-25 152 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()确保在完成读取响应后释放套接字。

相关问题