Почему я получаю исключение java.net.SocketException: сброс соединения

#java #http #sockets #jakarta-ee

#java #http #сокеты #джакарта-ee

Вопрос:

Мне нужно отправить несколько запросов на сторону сервера и получить ответ, иногда, когда я вызываю определенный метод для запуска следующего общего кода, я получаю одну ошибку в строке (addToCookieJar (connection);), есть идеи, как это произошло?

     URL url = new URL(providerURL);
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    connection.setRequestMethod("POST");
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setUseCaches(false);
    connection.setRequestProperty("Content-Type", "application/octet-stream");

    // We understand gzip encoding
    connection.addRequestProperty("Accept-Encoding", "gzip");

    if (cookie != null amp;amp; cookieHandler != null) {
        connection.setRequestProperty("Cookie", cookie);
    }

    if (cookieHandler == null) {
        addFromCookieJar(connection);
    }

    // Send the request
    ObjectOutputStream oos = new ObjectOutputStream(connection.getOutputStream());
    oos.writeObject(remote.getName());
    oos.writeObject(m.getName()); // method name
    oos.writeObject(m.getParameterTypes()); // formal parameters
    oos.writeObject(args); // actual parameters
    oos.flush();
    oos.close();

    if (cookieHandler == null) {
        cookieJar.put(new URI(providerURL), connection.getHeaderFields());
    }
  

Исключение:

    java.lang.reflect.UndeclaredThrowableException
            at $Proxy0.updateDocument(Unknown Source)
            at com.agst.ui.gantt.GanttPanel.doUpdateDocument(GanttPanel.java:1931)
            at com.agst.ui.gantt.GanttPanel.save(GanttPanel.java:1419)
            at com.agst.ui.gantt.GanttPanel$4.run(GanttPanel.java:1673)
            at java.lang.Thread.run(Unknown Source)

   Caused by: java.net.SocketException: Connection reset
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
            at java.lang.reflect.Constructor.newInstance(Unknown Source)
            at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
            at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
            at com.agst.rmi.RemoteCallHandler.call(RemoteCallHandler.java:196)
            at com.agst.rmi.RemoteCallHandler.invoke(RemoteCallHandler.java:142)
            ... 5 more

   Caused by: java.net.SocketException: Connection reset
            at java.net.SocketInputStream.read(Unknown Source)
            at java.io.BufferedInputStream.fill(Unknown Source)
            at java.io.BufferedInputStream.read1(Unknown Source)
            at java.io.BufferedInputStream.read(Unknown Source)
            at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
            at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
            at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
            at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
            at sun.net.www.protocol.http.HttpURLConnection.getHeaderFields(Unknown Source)
            at com.agst.rmi.RemoteCallHandler.addToCookieJar(RemoteCallHandler.java:529)
            at com.agst.rmi.RemoteCallHandler.call(RemoteCallHandler.java:192)
            ... 6 more
  

Комментарии:

1. Я видел, что сброс соединения отображается из-за ошибки в балансировщике нагрузки F5. Если возможно, попробуйте проверить подключение как можно более напрямую (например, нет Apache, нет балансировщика нагрузки) и посмотреть, сможете ли вы воспроизвести проблему. Например, появляется ли это при общении с локальным котом? Как насчет локального кота на следующей машине?

2. Можете ли вы подробнее рассказать об ошибке балансировщика нагрузки F5? Я думаю, что у меня такая же проблема с F5. Есть ли у вас дополнительная информация об этой ошибке (версия F5, ошибка в каком-либо трекере проблем и т.д.) Спасибо!

Ответ №1:

Эта ошибка указывает на то, что удаленная сторона закрыла соединение, в то время как ваша сторона все еще пыталась прочитать из него. Вы должны проверить, является ли

  • на сервере проблема (проверьте ее журналы) или
  • вы пытаетесь прочитать больше данных, чем предоставляет сервер

Комментарии:

1. На удаленной стороне я использую защищенный void doPost (запрос HttpServletRequest, ответ HttpServletResponse) для обработки этого. И все исключения перехватываются. Я думаю, что у этого не должно быть какой-либо проблемы

2. Это не второе из них. Исключение возникает внутри parseHTTPHeader метода.

3. спасибо, я следую методу connection.getHeaderFields()), он не вызывает метод parseHTTPHeader внутренне

4. еще один вопрос, если моей серверной логической программе требуется длительное время, возможно ли, что я получаю это исключение.

Ответ №2:

Что делает addToCookieJar метод? Передача объекта connection может быть проблемой для этого метода, поскольку вы закрываете OutputStream полученный из соединения. Вы случайно не пытаетесь извлечь объект выходного потока и работать с ним в методе addToCookieJar?

Комментарии:

1. метод addToCookieJar выполняет: cookieJar.put(новый URI(providerURL), connection.getHeaderFields()); когда connection.getHeaderFields() не считывает OutputStream

2. @Jammy: Я все еще думаю, что проблема связана с переданным объектом Connection. Можете ли вы попробовать добавить в cookie jar перед закрытием выходного потока и протестировать его?

3. Спасибо, я попробую, но я также не понимаю, почему эта ошибка иногда возникает при запуске какого-то определенного метода.