URL-соединение получить входной поток не удается - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь найти размер каталога на сервере. Итак, я определил класс, чтобы получить доступ к серверу и найти размер:

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 в мое java-приложение с весенней загрузкой, я получил это исключение ввода-вывода,

java.io.IOException: сервер вернул код ответа HTTP: 500 для URL: http://rb -cmbinex.com / software / rfs / 16.2S813 / rfs_ni / rootfs / на sun.net.www.protocol.http.HttpURLConnection.getInputStream0 (неизвестный источник) на sun.net.www.protocol.http.HttpURLConnection.getInputStream (неизвестный источник) на com.bosch.boardfarm.model.SoftwareDownload.httpFindSoftwarePackage (SoftwareDownload.java:113) на com.bosch.boardfarm.model.SoftwareDownload.httpFindSoftwarePackage (SoftwareDownload.java:143)

Затем я обнаружил, что исключение ввода-вывода происходит из строки (при получении входного потока для подключенного URL-адреса), InputStream inStream = uc.getInputStream ();

Может ли кто-нибудь помочь решить эту проблему.

1 Ответ

0 голосов
/ 10 мая 2018

Ошибка 500 означает:

500 Внутренняя ошибка сервера

Общее сообщение об ошибке, которое появляется, когда возникло непредвиденное состояние и более подходящее сообщение не подходит.

Короче говоря, что-то не так с сервером, с которым вы пытаетесь общаться. Вы можете получить больше информации, прочитав и распечатав содержимое потока ошибок. Однако это может быть пустая страница или страница с сообщениями об ошибках, которая не содержит полезной информации.


Сервер активен и работает.

Вы знаете это, потому что .....? (Когда я пытался поговорить с сервером, у меня просто был тайм-аут.)

Если это ваш сервер, проверьте файлы журнала, чтобы увидеть, есть ли сообщения журнала, соответствующие ответам с кодом 500. (Вы можете временно увеличить уровень ведения журнала ...)

uc.getResponseCode(), uc.getResponseMessage() и uc.getErrorStream() эти опции недоступны в URLConnection

Приведите соединение к HttpURLConnection, и затем вы сможете вызывать эти методы.

Я не сталкивался с этой проблемой, когда запускал этот класс как отдельную программу. Предположим, что существует 10 каталогов, я могу пройти первые 5 каталогов, исключение получено случайным образом при обходе каталога 6-10.

Это предполагает несколько возможностей:

  • Возможно, ваши запросы вызывают временную перегрузку и вызывают внутренние ошибки.

  • Возможно, ваши запросы вызывают временную перегрузку, и сервер отвечает 500 ответами, чтобы вы замедлились. (A 503 будет более подходящим ответом в этом случае.)

  • Возможно, этот ответ является поведением, предназначенным для сдерживания веб-скребков !!

  • Возможно, существует балансировщик нагрузки, отправляющий запросы на несколько серверов, и один из них (в настоящее время) не работает должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...