URL连接获取输入流失败

时间:2018-05-10 11:56:57

标签: java http spring-boot url

我试图找到服务器中目录的大小。所以我已经定义了类来获取服务器的访问权并找到大小:

public class SoftwareDownload {
  private String inputUrl;
  private String destinationPath;
  private String userName;
  private String userPassword;
  private URL url = null;
  private URLConnection uc = null;
  private String userpass;
  private String basicAuth;
  private boolean isAuthendicated = false;

  public SoftwareDownload(String inputUrl, String destinationPath, String userName, String userPassword) {
    this.inputUrl = inputUrl;
    this.destinationPath = destinationPath;
    this.userName = userName;
    this.userPassword = userPassword;
    userpass = userName + ":" + userPassword;
    basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());
    try {
      url = new URL(this.inputUrl);
      try {
        uc = url.openConnection();
        uc.setRequestProperty ("Authorization", basicAuth);
        isAuthendicated = true;
      } catch (IOException e) {
        // TODO Auto-generated catch block
        System.out.println("UC check nul");
        e.printStackTrace();
      }
    } catch (MalformedURLException e) {
      // TODO Auto-generated catch block
      System.out.println("Connection check nul");
      e.printStackTrace();
    }
  }


    public long httpFindSoftwarePackage ( int count,boolean isSizeRequired) throws IOException {
    long packageByteCnt = 0;

    InputStream inStream = uc.getInputStream();
    InputStreamReader streamReader=new InputStreamReader(inStream);
    BufferedReader inputStream = new BufferedReader(streamReader);
    String line = "";
    while(line != null) {
      line = inputStream.readLine();
      if ( (line != null ) && ( line.startsWith("<a href=")) ) {
        Document doc = Jsoup.parse(line);
        Element link = doc.select("a").first();
        String linkHref = link.attr("href");
        String sourceDir = inputUrl+"/"+linkHref;
        SoftwareDownload downloadimage = new SoftwareDownload (sourceDir,null,userName,userPassword);
        if( linkHref.endsWith("/") == true ) {
          packageByteCnt+=downloadimage.httpFindSoftwarePackage(count+1,isSizeRequired);
        }
        else
        {
            packageByteCnt+=downloadimage.uc.getContentLengthLong();
        }
      }
    }
    return packageByteCnt;
  }
}

Class Main:
  public static void main(final String[] args) throws IOException {
    String httpurl ="http://rb-cmbinex.com/software/rfs/16.2S813/rfs_ni";
    String destiDir = "d:/TestDirectory";
    String user = "username";
    String password = "Password#123";

    SoftwareDownload download = new SoftwareDownload(httpurl, null, user, password);

   System.out.println("Total Package Size : " + download.httpFindSoftwarePackage(0, true));
}

当我单独运行此程序时,我可以读取目录的大小。但是,在我将这个SoftwareDownload调用集成到我的spring boot java应用程序的同时,我得到了这个IO异常,

java.io.IOException:服务器返回HTTP响应代码:500为URL:http://rb-cmbinex.com/software/rfs/16.2S813/rfs_ni/rootfs/     at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)     at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)     在com.bosch.boardfarm.model.SoftwareDownload.httpFindSoftwarePackage(SoftwareDownload.java:113)     在com.bosch.boardfarm.model.SoftwareDownload.httpFindSoftwarePackage(SoftwareDownload.java:143)

然后我发现IO异常来自该行(同时为连接的URL设置输入流),         InputStream inStream = uc.getInputStream();

有人可以帮助解决此问题。

1 个答案:

答案 0 :(得分:0)

500错误意味着:

  

500内部服务器错误

     

一个通用错误消息,在遇到意外情况且没有更合适的消息时给出。

简而言之,您尝试与之交谈的服务器出了问题。您可以通过读取和打印错误流的内容来获取更多信息。但是,它可能是空的,或者是&#34;泛型&#34;错误页面,没有提供有用的信息。

  

服务器处于活动状态并正在运行。

你知道这是因为.....? (当我试图与服务器通话时,我只是暂停了。)

如果这是您的服务器,请检查日志文件以查看是否存在与代码500响应相对应的日志消息。 (您可能希望暂时提高日志记录级别...)

  

uc.getResponseCode()uc.getResponseMessage()uc.getErrorStream()这些选项在URLConnection中不可用

将连接转换为HttpURLConnection,然后您可以调用这些方法。

  

当我将这个类作为一个单独的程序运行时,我没有遇到这个问题。假设有10个目录,我可以遍历前5个目录,在遍历6到10目录时随机获取异常。

这表明了几种可能性:

  • 也许您的请求导致临时过载,并且导致内部错误。

  • 也许您的请求导致临时过载,服务器响应500响应导致您减速。 (在这种情况下,A 503将是更合适的答案。)

  • 也许这种反应是一种旨在阻止网络刮刀的行为!!

  • 也许有一个负载均衡器向多个服务器发送请求,其中一个(当前)无法正常工作。