solucion - Código simple de Java: java.net.SocketException: fin de archivo inesperado del servidor
java.net.socketexception connection reset in java (6)
Escribí un código simple en Java, el método debería conectarse al sitio web y devolver el 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;
}
Cuando lo uso en mi PC, funciona bien, pero cuando coloco el archivo .jar en el servidor obtengo este error:
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)
El problema es bastante extraño porque la excepción no se lanza cada vez, a veces todo está bien y el programa funciona bien.
Alguien tiene alguna idea?
Resumen
Esta excepción se encuentra cuando está esperando una respuesta, pero el socket se cerró abruptamente.
Explicación detallada
El HTTPClient
de Java, encontrado here , lanza una SocketException
con el mensaje "Fin de archivo inesperado del servidor" en una circunstancia muy específica.
Después de realizar una solicitud, HTTPClient
obtiene un InputStream
vinculado al socket asociado con la solicitud. Luego sondea ese InputStream
repetidamente hasta que:
- Encuentra la cadena "HTTP / 1".
- Se llega al final de
InputStream
antes de que se lean 8 caracteres - Encuentra una cadena distinta de "HTTP / 1".
En el caso del número 2, HTTPClient
lanzará esta SocketException
si se SocketException
alguna de las siguientes condiciones:
- El método HTTP es
CONNECT
- El método HTTP es
POST
y el cliente está configurado en modo de transmisión
¿Por qué sucedería esto?
Esto indica que el socket TCP se cerró antes de que el servidor pudiera enviar una respuesta. Esto podría suceder por varias razones, pero algunas posibilidades son:
- Se perdió la conexión de red
- El servidor decidió cerrar la conexión.
- Algo entre el cliente y el servidor (nginx, enrutador, etc.) terminó la solicitud
Nota: cuando Nginx vuelve a cargar su configuración, cierra forzosamente cualquier conexión HTTP Keep-Alive en vuelo (incluso POST), causando este error exacto.
"Fin de archivo inesperado" implica que el servidor remoto aceptó y cerró la conexión sin enviar una respuesta. Es posible que el sistema remoto esté demasiado ocupado para manejar la solicitud, o que haya un error en la red que interrumpa aleatoriamente las conexiones.
Con la información disponible es imposible decir qué está mal. Si tiene acceso a los servidores en cuestión, puede usar las herramientas de rastreo de paquetes para encontrar exactamente qué se envía y recibe, y ver los registros del proceso del servidor para ver si hay algún mensaje de error.
En mi caso se resolvió simplemente pasando el proxy a la conexión. Gracias a @Andreas Panagiotidis .
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("<YOUR.HOST>", 80)));
HttpsURLConnection con = (HttpsURLConnection) url.openConnection(proxy);
Recibo este error cuando no configuro el encabezado de autenticación o si configuro las credenciales incorrectas.
Tengo esta excepción también. MI código de error está debajo
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(requestMethod);
connection.setRequestProperty("Content-type", "JSON");
He encontrado que "Tipo de contenido" no debe ser "JSON", ¡está mal! Resolví esta excepción actualizando esta línea a continuación.
connection.setRequestProperty("Content-type", "application/json");
puedes revisar tu "tipo de contenido"
Yo sugeriría usar tiburón de alambre para rastrear paquetes. Si está utilizando Ubuntu, sudo-apt obtiene wireshark. Como Joni dijo que la única manera de averiguar qué está mal es seguir las solicitudes GET y sus respuestas asociadas.