Java простой код: java.net.SocketException: Неожиданный конец файла с сервера - программирование
Подтвердить что ты не робот

Java простой код: java.net.SocketException: Неожиданный конец файла с сервера

Я написал простой код в Java, метод должен подключиться к веб-сайту и вернуть BufferedReader.

private BufferedReader getConnection(String url_a) {
        URL url;
        try {
            System.out.println("getting connection");
            url = new URL(url_a);
            HttpURLConnection urlConnection = (HttpURLConnection) 
                     url.openConnection();
            urlConnection.addRequestProperty("User-Agent",
                    "Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924"
                     + "Epiphany/1.4.4 (Ubuntu)");
            inStream = new InputStreamReader(urlConnection.getInputStream());
            return new BufferedReader(inStream);
        } catch (Exception ex) {
            Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;

}

Когда я использую его на своем ПК, он работает нормально, но когда я помещаю файл .jar на сервер, я получаю эту ошибку:

java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:718)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:715)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322)
at dataconverter.Reader.getConnection(Reader.java.260)

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

Есть ли у кого-нибудь идеи?

4b9b3361

Ответ 1

"Неожиданный конец файла" означает, что удаленный сервер принял и закрыл соединение без отправки ответа. Возможно, удаленная система слишком занята, чтобы обрабатывать запрос, или что существует сетевая ошибка, которая случайно отключает соединения.

С доступной информацией невозможно сказать, что происходит не так. Если у вас есть доступ к указанным серверам, вы можете использовать инструменты поиска пакетов, чтобы найти то, что точно отправлено и получено, и посмотреть журналы на серверный процесс, чтобы увидеть, есть ли сообщения об ошибках.

Ответ 2

Резюме

Это исключение встречается, когда вы ожидаете ответа, но сокет был внезапно закрыт.

Подробное объяснение

Java HTTPClient, найденный здесь, выдает сообщение SocketException с сообщением "Неожиданный конец файла с сервера" в очень специфических обстоятельствах.

После выполнения запроса HTTPClient получает привязку InputStream к сокету, связанному с запросом. Затем он проверяет, что InputStream несколько раз, пока он не будет:

  • Находит строку "HTTP/1."
  • Конец InputStream достигается до чтения 8 символов.
  • Находит строку, отличную от "HTTP/1."

В случае номера 2 HTTPClient будет выбрасывать этот SocketException, если выполняется одно из следующих условий:

  • Метод HTTP CONNECT
  • HTTP-метод POST, и клиент настроен на режим потоковой передачи

Почему это произойдет

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

  • Сетевое соединение было потеряно
  • Сервер решил закрыть соединение
  • Что-то между клиентом и сервером (nginx, router и т.д.) завершило запрос

Примечание. Когда Nginx перезагружает свою конфигурацию, он принудительно закрывает любые HTTP-соединения Keep-Alive в прямом эфире (даже POST) вызвав эту точную ошибку.

Ответ 3

Я получаю эту ошибку, когда не устанавливаю заголовок аутентификации или неверные учетные данные.

Ответ 4

Я бы предложил использовать проводную акулу для отслеживания пакетов. Если вы используете Ubuntu, sudo-apt получает wirehark. Как сказал Джони, единственный способ выяснить, что происходит, - это следовать запросам GET и связанным с ними ответам.

http://www.wireshark.org/download.html

Ответ 5

В моем случае это было решено просто передачей прокси в соединение. Спасибо @Andreas Panagiotidis.

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("<YOUR.HOST>", 80)));
HttpsURLConnection con = (HttpsURLConnection) url.openConnection(proxy);

Ответ 6

Скорее всего, установленные вами заголовки неверны или недопустимы.

Пример: connnection.setRequestProperty("тип контента", "приложение /json");

Ответ 7

У меня тоже есть это исключение. МОЙ код ошибки ниже

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod(requestMethod);
        connection.setRequestProperty("Content-type", "JSON");

Я обнаружил, что "Content-type" не должен быть "JSON", это неправильно! Я решил это исключение, обновив эту строку ниже

        connection.setRequestProperty("Content-type", "application/json");

вы можете проверить свой "Content-type"