sockettimeoutexception - Cómo solucionar java.net.SocketException: Broken pipe?
java.net.sockettimeoutexception read timed out solucion (9)
Estoy utilizando el cliente HTTP de Apache commons para llamar a la url usando el método de publicación para publicar los parámetros y rara vez arroja el siguiente error.
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
at java.io.FilterOutputStream.write(FilterOutputStream.java:80)
at org.apache.commons.httpclient.methods.ByteArrayRequestEntity.writeRequest(ByteArrayRequestEntity.java:90)
at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499)
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
¿Puede alguien sugerir qué está causando esta excepción y cómo depurarla?
JavaDoc:
La longitud máxima de la cola para las indicaciones de conexión entrante (una solicitud de conexión) se establece en 50. Si llega una indicación de conexión cuando la cola está llena, la conexión se rechaza.
Debería aumentar el parámetro "backlog" de su ServerSocket, por ejemplo
int backlogSize = 50 ;
new ServerSocket(port, backlogSize);
El problema podría ser que sus archivos desplegados no se actualicen con los métodos de RMI correctos. Verifique que su interfaz RMI tenga parámetros actualizados o estructuras de datos actualizadas que su cliente no tenga. O que su cliente RMI no tiene parámetros que difieran de lo que tiene su versión de servidor.
Esto es solo una suposición educada. Después de volver a implementar los archivos de clase de mi aplicación de servidor y volver a probar, el problema de "Tubo roto" desapareció.
En nuestro caso, experimentamos esto al realizar una prueba de carga en nuestro servidor de aplicaciones. El problema fue que necesitamos agregar memoria adicional a nuestra JVM porque se estaba acabando. Esto resolvió el problema.
Intente aumentar la memoria disponible para la JVM y / o monitoree el uso de la memoria cuando obtiene esos errores.
Esto se produce al escribir en una conexión cuando el otro extremo ya la ha cerrado.
Entonces tiene un protocolo de aplicación mal definido o implementado.
Implementé la funcionalidad de descarga de datos a través del servidor FTP y encontré la misma excepción allí al mismo tiempo que reanudé la descarga. Para resolver esta excepción, siempre deberá desconectarse de la sesión anterior y crear una nueva instancia del Cliente y una nueva conexión con el servidor. Este mismo enfoque podría ser útil también para HTTPClient.
La causa es que el par remoto cierra su socket (crash por ejemplo), por lo que si intentas escribirle datos, por ejemplo, obtendrás esto. para resolver eso, inserte operaciones de lectura / escritura en el socket entre:
try {
/* your code */
} catch (SocketException e) {
e.printStackTrace();
}
Las respuestas anteriores ilustran el motivo de esta java.net.SocketException: Broken pipe
: el otro extremo cerró la conexión. Me gustaría compartir la experiencia de lo que sucedió cuando la encontré:
- a petición del cliente, el encabezado
Content-Type
se configura erróneamente más grande que el cuerpo de la solicitud en realidad (de hecho, no había ningún cuerpo) - el servicio inferior en socket tomcat estaba esperando datos corporales de ese tamaño (http está en TCP lo que garantiza la entrega encapsulando y ...)
- cuando expiraron 60 segundos, tomcat lanza la excepción de tiempo de espera:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception java.net.SocketTimeoutException: null
- el cliente recibe una respuesta con el código de estado 500 debido a la excepción de tiempo de espera.
- conexión cercana del cliente (porque recibe respuesta).
- tomcat arroja
java.net.SocketException: Broken pipe
porque el cliente lo cerró.
A veces, Tomcat no lanza una excepción pip interrumpida, porque la excepción de timeout cierra la conexión, por qué esa diferencia también me confunde.
SocketException: Broken pipe, es causada por el ''otro extremo'' (El cliente o el servidor) que cierra la conexión mientras el código lee o escribe en la conexión.
Esta es una excepción muy común en las aplicaciones cliente / servidor que reciben tráfico de clientes o servidores fuera del control de la aplicación. Por ejemplo, el cliente es un navegador. Si el navegador realiza una llamada Ajax, y / o el usuario simplemente cierra la página o el navegador, esto puede matar a todas las comunicaciones inesperadamente. Básicamente, verá este error cada vez que el otro extremo finalice su aplicación, y usted no lo estaba anticipando.
Si experimenta esta Excepción en su aplicación, significa que debe verificar su código donde ocurre el IO (Entrada / Salida) y envolverlo con un bloque de prueba / captura para capturar esta IOException. Depende de usted decidir cómo quiere manejar esta situación semi-válida.
En su caso, el primer lugar donde todavía tiene el control es la llamada a HttpMethodDirector.executeWithRetry
: asegúrese de que la llamada se envuelve con el bloque try / catch y trátelo como lo considere oportuno.
Recomiendo encarecidamente que no se registren los errores específicos de SocketException-Broken Pipe en nada que no sean los niveles de depuración / rastreo. De lo contrario, esto se puede usar como una forma de ataque DOS (denegación de servicio) al completar los registros. Prueba y endurece y prueba negativamente tu aplicación para este escenario común.
Todas las transmisiones y conexiones abiertas deben cerrarse correctamente, por lo que la próxima vez que intentemos usar el objeto urlConnection, no arrojará un error. Como ejemplo, el siguiente cambio de código solucionó el error.
Antes de:
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write("Some text");
bw.close();
out.close();
Después:
OutputStream os = urlConnection.getOutputStream();
OutputStream out = new BufferedOutputStream(os);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write("Some text");
bw.close();
out.close();
os.close(); // This is a must.