Estoy usando el cliente http 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)
¿Alguien puede sugerir qué está causando esta excepción y cómo depurarla?
Respuestas:
Esto es causado por:
Entonces, en ambos casos, tiene un protocolo de aplicación mal definido o implementado.
Hay una tercera razón que no documentaré aquí, pero que implica que los pares tomen medidas deliberadas para restablecer en lugar de cerrar correctamente la conexión.
fuente
XMLHttpRequest.abort()
).En nuestro caso, experimentamos esto al realizar una prueba de carga en nuestro servidor de aplicaciones. El problema resultó que necesitamos agregar memoria adicional a nuestra JVM porque se estaba agotando. Esto resolvió el problema.
Intente aumentar la memoria disponible para la JVM o supervise el uso de la memoria cuando reciba esos errores.
fuente
SocketException: tubería rota, es causada por el 'otro extremo' (el cliente o el servidor) que cierra la conexión mientras su código lee o escribe en la conexión.
Esta es una excepción muy común en 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 efectivamente toda comunicación inesperadamente. Básicamente, verá este error cada vez que el otro extremo finalice su aplicación, y 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 try / catch para capturar esta IOException. Entonces depende de usted decidir cómo quiere manejar esta situación semi-válida.
En su caso, el primer lugar donde aún tiene control es la llamada a
HttpMethodDirector.executeWithRetry
- Así que asegúrese de que la llamada esté envuelta con el bloque try / catch y manejela como mejor le parezca.Recomiendo encarecidamente que no se registren errores específicos de SocketException-Broken Pipe en cualquier otra cosa 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 llenar los registros. Intente y endurezca y pruebe negativamente su aplicación para este escenario común.
fuente
Todas las secuencias 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 para mí.
Antes de:
Después:
fuente
BufferedOutputStream
siempre llamaclose()
a su flujo de salida subyacente (por lo tanto, al flujo de salida deurlConnection
). Ver docs.oracle.com/javase/6/docs/api/java/io/… y docs.oracle.com/javase/6/docs/api/java/io/… Entonces, cuando llame,os.close()
ya debería estar cerrado . ¿No?Implementé la funcionalidad de descarga de datos a través del servidor FTP y encontré la misma excepción allí al reanudar esa descarga. Para resolver esta excepción, siempre tendrá que desconectarse de la sesión anterior y crear una nueva instancia del Cliente y una nueva conexión con el servidor. Este mismo enfoque también podría ser útil para HTTPClient.
fuente
Tuve el mismo problema mientras desarrollaba una aplicación Java simple que escucha en un TCP específico. Por lo general, no tuve ningún problema, pero cuando ejecuté una prueba de esfuerzo, noté que algunas conexiones se rompieron con un error
socket write exception
.Después de la investigación, encontré una solución que resuelve mi problema. Sé que esta pregunta es bastante antigua, pero prefiero compartir mi solución, alguien puede encontrarla útil.
El problema estaba en la creación de ServerSocket. Leí de Javadoc que hay un límite predeterminado de 50 sockets pendientes. Si intenta abrir otra conexión, se rechazarán. La solución consiste simplemente en cambiar esta configuración predeterminada en el lado del servidor. En el siguiente caso, creo un servidor de Socket que escucha en el puerto TCP
10_000
y acepta max200
sockets pendientes.Desde Javadoc de ServerSocket :
fuente
El problema podría ser que sus archivos desplegados no se actualicen con los métodos RMI correctos. Verifique que su interfaz RMI tenga parámetros actualizados o estructuras de datos actualizadas que su cliente no tiene. O que su cliente RMI no tiene parámetros que difieran de la versión de su 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 realizar las pruebas, el problema de "tubería rota" desapareció.
fuente
Las respuestas anteriores ilustran la razón de esto
java.net.SocketException: Broken pipe
: el otro extremo cerró la conexión. Me gustaría compartir la experiencia de lo que sucedió cuando lo encontré:Content-Type
encabezado se establece erróneamente más grande que el cuerpo de la solicitud (de hecho, no había ningún cuerpo)Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception java.net.SocketTimeoutException: null
java.net.SocketException: Broken pipe
porque el cliente lo cerró.A veces, tomcat no arroja una excepción de pip roto, porque la excepción de tiempo de espera cierra la conexión, por qué esa diferencia también me confunde.
fuente
Content-Type
encabezado no especifica un número, por lo que no puede ser "más grande" que nada. Las excepciones de tiempo de espera no cierran el socket. La respuesta no tiene ningún sentido.Debe aumentar el parámetro "backlog" de su ServerSocket, por ejemplo
fuente
La causa es que el par remoto cierra su socket (bloqueo, por ejemplo), por lo que si intenta escribir datos en él, por ejemplo, obtendrá esto. para resolver eso, proteja las operaciones de lectura / escritura en el socket entre (intente catch), luego administre el caso de pérdida de conexión en el catch (renueve la conexión, pare el programa, ... etc.):
fuente