it-swarm.com.de

Java-Einfachcode: Java.net.SocketException: Unerwartetes Ende der Datei vom Server

Ich habe einfachen Code in Java geschrieben. Die Methode sollte eine Verbindung zur Website herstellen und den BufferedReader zurückgeben.

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;

}

Wenn ich es auf meinem PC verwende, funktioniert es gut, aber wenn ich die .jar-Datei auf den Server stecke, erhalte ich diesen Fehler:

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)

Das Problem ist ziemlich seltsam, da die Ausnahme nicht jedes Mal ausgelöst wird, manchmal ist alles in Ordnung und das Programm funktioniert einwandfrei.

Hat jemand irgendwelche Ideen?

21

"Unerwartetes Dateiende" bedeutet, dass der Remote-Server die Verbindung akzeptiert und geschlossen hat, ohne eine Antwort zu senden. Möglicherweise ist das ferne System zu beschäftigt, um die Anforderung zu bearbeiten, oder es gibt einen Netzwerkfehler, durch den Verbindungen zufällig getrennt werden.

Mit den verfügbaren Informationen ist es unmöglich zu sagen, was schief läuft. Wenn Sie Zugriff auf die betreffenden Server haben, können Sie mit Hilfe von Paketsniffing-Tools herausfinden, was genau gesendet und empfangen wird, und in den Protokollen des Serverprozesses nach Fehlern suchen.

42
Joni

Zusammenfassung

Diese Ausnahme tritt auf, wenn Sie eine Antwort erwarten, der Socket jedoch abrupt geschlossen wurde.

Ausführliche Erklärung

Javas HTTPClient, gefunden here , wirft einen SocketException mit der Nachricht "Unerwartetes Ende der Datei vom Server" in einem bestimmten Fall.

Nach der Anforderung erhält HTTPClient einen InputStream, der an den der Anforderung zugeordneten Socket gebunden ist. Dann fragt er InputStream wiederholt ab, bis entweder

  1. Sucht die Zeichenfolge "HTTP/1".
  2. Das Ende von InputStream ist erreicht, bevor 8 Zeichen gelesen werden
  3. Sucht eine andere Zeichenfolge als "HTTP/1".

Im Falle der Nummer 2 wird HTTPClient diesen SocketExceptionwerfen, wenn eine der folgenden Bedingungen zutrifft:

  • Die HTTP-Methode lautet CONNECT
  • Die HTTP-Methode ist POST und der Client ist auf den Streaming-Modus eingestellt

Warum sollte das passieren?

Dies zeigt an, dass der TCP - Socket geschlossen wurde, bevor der Server eine Antwort senden konnte. Dies kann aus verschiedenen Gründen geschehen, es gibt jedoch einige Möglichkeiten:

  • Die Netzwerkverbindung wurde unterbrochen
  • Der Server hat beschlossen, die Verbindung zu trennen
  • Zwischen Client und Server (nginx, Router usw.) wurde die Anforderung beendet

Hinweis: Wenn Nginx seine Konfiguration neu lädt, schließt alle HTTP-Keep-Alive-Verbindungen während des Fluges (auch POSTs) zwangsweise und verursacht genau diesen Fehler.

23
Cory Klein

Ich erhalte diese Fehlermeldung, wenn ich den Authentifizierungsheader oder falsche Anmeldeinformationen nicht setze. 

In meinem Fall wurde das Problem gelöst, indem nur ein Proxy zur Verbindung übergeben wurde. Danke an @Andreas Panagiotidis .

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

Ich würde vorschlagen, einen Drahthai zu verwenden, um Pakete zu verfolgen. Wenn Sie Ubuntu verwenden, erhalten Sie mit Sudo-apt Wireshark. Wie Joni erklärte, besteht der einzige Weg, um herauszufinden, was falsch läuft, darin, die GET-Anforderungen und die zugehörigen Antworten zu befolgen. 

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

0
SeahawksRdaBest

Höchstwahrscheinlich sind die von Ihnen festgelegten Überschriften falsch oder nicht akzeptabel.

Beispiel: connnection.setRequestProperty ("content-type", "application/json");

0
Kris