org clientabortexception broken java nio

clientabortexception - Java NIO: ¿Qué significa IOException: Broken pipe?



java io ioexception broken pipe (4)

¿Qué causa una "tubería rota" y, lo que es más importante, ¿es posible recuperarse de ese estado?

Es causado por algo que hace que la conexión se cierre. (No es su aplicación la que cerró la conexión: eso hubiera resultado en una excepción diferente).

No es posible recuperar la conexión. Necesitas abrir uno nuevo.

Si no se puede recuperar, parece que esto sería una buena señal de que ha ocurrido un problema irreversible y que simplemente debería cerrar esta conexión de socket. ¿Es eso una suposición razonable?

Sí. Una vez que haya recibido esa excepción, el socket no funcionará nunca más. Cerrarlo es lo único sensato que hay que hacer.

¿Hay algún momento en el que esta IOException ocurra mientras la conexión del socket aún se está conectando correctamente en primer lugar (en lugar de una conexión de trabajo que falló en algún momento)?

No. (O al menos, no sin subvertir el comportamiento correcto de la pila de red del OS, la JVM y / o su aplicación).

¿Es aconsejable llamar siempre a SocketChannel.isConnected() antes de intentar un SocketChannel.write() ...

En general, es una mala idea llamar a r.isXYZ() antes de una llamada que usa el recurso (externo) r . Hay una pequeña posibilidad de que el estado del recurso cambie entre las dos llamadas. Es una mejor idea hacer la acción, atrapar la IOException (o lo que sea) que resulte de la acción fallida y tomar las medidas correctivas necesarias.

En este caso particular, llamar isConnected() tiene sentido. El método se define para que sea true si el socket se conectó en algún punto del pasado . No te dice si la conexión aún está activa. La única forma de determinar si la conexión está viva es intentar usarla; por ejemplo, leer o escribir.

Para algunas de mis conexiones Java NIO, cuando tengo una SocketChannel.write(ByteBuffer) , arroja una IOException : "Broken pipe".

¿Qué causa una "tubería rota" y, lo que es más importante, ¿es posible recuperarse de ese estado? Si no se puede recuperar, parece que esto sería una buena señal de que ha ocurrido un problema irreversible y que simplemente debería cerrar esta conexión de socket. ¿Es eso una suposición razonable? ¿Hay algún momento en el que esta IOException ocurra mientras la conexión del socket aún se está conectando correctamente en primer lugar (en lugar de una conexión de trabajo que falló en algún momento)?

En una nota al margen, es aconsejable llamar siempre a SocketChannel.isConnected() antes de intentar un SocketChannel.write() , y si es así, también puedo asumir que la conexión está "rota" y debería cerrarse si ambos SocketChannel.isConnected() y SocketChannel.isConnectionPending() son ambos false ?

¡Gracias!


Debes asumir que el socket estaba cerrado en el otro extremo. Envuelva su código con un bloque try catch para IOException.

Puede usar isConnected () para determinar si el SocketChannel está conectado o no, pero eso podría cambiar antes de que finalice su invocación de write (). Intenta llamarlo en tu bloque catch para ver si de hecho es por eso que recibes la IOException.


La tubería rota simplemente significa que la conexión ha fallado. Es razonable suponer que esto es irrecuperable, y luego realizar cualquier acción de limpieza requerida (conexiones de cierre, etc.). No creo que puedas ver esto simplemente debido a que la conexión aún no está completa.

Si está utilizando el modo sin bloqueo, el método SocketChannel.connect devolverá false y deberá usar los métodos isConnectionPending y finishConnect para asegurarse de que la conexión esté completa. En general, codifico en función de la expectativa de que las cosas funcionen, y luego capturo excepciones para detectar fallas, en lugar de depender de las llamadas frecuentes a "isConnected".


Tubo roto significa que escribió a una conexión que ya está cerrada por el otro extremo.

isConnected() no detecta esta condición. Solo una escritura lo hace.

es aconsejable llamar siempre a SocketChannel.isConnected () antes de intentar un SocketChannel.write ()

No tiene sentido. El zócalo enestá conectado. Lo conectaste Lo que no puede estar conectado es la conexión en sí, y solo puedes determinarlo intentándolo.