繁体   English   中英

java.net.SocketException:权限被拒绝:连接。 可能是什么原因以及如何避免它?

[英]java.net.SocketException: Permission denied: connect. What could be the cause and how to avoid it?

向服务器发送大量请求时,我遇到了java.net.SocketException (权限被拒绝:连接)。 我已经尝试过其他线程中提到的-Djava.net.preferIPv4Stack=true选项。 此问题仅在已建立大量连接后才会发生。 以下代码可用于重现该问题:

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()方法时,它还没有抛出异常。

尝试使用 httpCon.disconnect() 确保在完成读取响应后重新释放套接字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM