solucion servidor net java sockets httpurlconnection

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:

  1. Encuentra la cadena "HTTP / 1".
  2. Se llega al final de InputStream antes de que se lean 8 caracteres
  3. 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.

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