Arreglar Java.Net.SocketException: error de tubería rota en Java

Mehvish Ashiq 12 octubre 2023
Arreglar Java.Net.SocketException: error de tubería rota en Java

Este tutorial demuestra el error java.net.SocketException: tubería rota utilizando la programación Java y destaca sus posibles causas y soluciones.

Descripción del error, razones y soluciones

Es importante conocer el error antes de desenterrar sus causas y encontrar soluciones. Entonces, comencemos con la demostración del error donde necesitamos enviar el tamaño del búfer dinámico a un flujo de socket, que funciona bien.

El error ocurre cuando intentamos enviar más de un búfer con un tamaño mayor que el int myBufferSize = 18 * 1024; (es un valor indicativo).

Código de ejemplo:

byte[] bs = new byte[myBufferSize];
while (...) {
  fileInputStream.read(bs);
  byte[] bufferToSend = new byte[sizeBuffer];
  DataOutputStream dataOutputStream = new DataOutputStream(client.getoutputStream());
  dataOutputStream.writeInt(bufferToSend.length);
  dataOutputStream.write(bufferToSend);
  dataOutputStream.flush();
}

Error de descripción:

java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)

¿Qué significa la tubería rota? La tubería rota significa que una máquina está tratando de escribir/leer datos hacia/desde una tubería mientras que una máquina en el otro lado de la tubería ha sido cerrada.

Dado que la conexión finaliza, cualquier nueva conexión debe establecerse para transferir los datos. De lo contrario, la transferencia de datos cesaría.

Recuerde que Java no tiene BrokenPipeException en particular.

Este tipo de error estaría visiblemente envuelto en las diferentes excepciones, por ejemplo, IOException y SocketException. En nuestro caso, la tubería rota está envuelta en SocketException.

¿Por qué tenemos este problema y cómo resolverlo? Algunas de las causas comunes se dan en la siguiente sección.

Razones para el error java.net.SocketException: tubería rota en Java

Podemos enfrentar este error si sucede algo de lo siguiente.

  1. Este error ocurre de forma intermitente cuando varios clientes se conectan a un servidor y varios clientes cierran su conexión antes de que la respuesta se entregue/transfiera por completo.
  2. La mayoría de las veces, sucede cuando escribimos en una conexión ya cerrada en el otro extremo.
  3. También puede ocurrir cuando un par cierra una conexión sin leer todos los datos, pendientes en su extremo. En otro caso, el par realiza una acción deliberada para restablecer en lugar de cerrar correctamente la conexión.
  4. El usuario cierra el navegador antes de que una página se cargue por completo, lo que provoca una desconexión inesperada de la sesión del cliente para un servidor.
  5. O los usuarios navegan a otra página antes de que la página actual se cargue por completo.
  6. También recibimos este error cuando nuestra conexión a Internet falla durante la carga.
  7. Otra situación para este error es cuando un navegador agotó el tiempo de espera de una conexión para que una conexión de solicitud haya finalizado. Principalmente, ocurre cuando intentamos cargar grandes recursos.

Posibles soluciones para erradicar el error java.net.SocketException: Broken pipe en Java

Podemos ir de varias maneras para eliminar este error mientras hacemos la programación cliente-servidor. ¿Queremos ignorar o manejar la causa raíz para que los desarrolladores lo sepan?

  1. Generalmente, el manejo de este tipo de error para las aplicaciones del servidor es necesario para que nuestro servidor no se vea afectado por otros clientes. Sí, como persona de soporte, podemos ignorarlo porque el cliente ya está desconectado antes de que los datos o la respuesta se transfieran por completo.

  2. Si el error ocurre mientras se cargan grandes recursos, debemos hacer que nuestra API esté bien con un tiempo de espera de solicitud prolongado.

  3. A veces, los escáneres de puertos hacen su trabajo abriendo una conexión y cerrándola inmediatamente. Nuestro servidor no está programado para manejar la falla de conexión.

    Es porque no codificamos para esta situación. Aquí, necesitamos usar try-catch para manejar esta situación.

  4. El problema de la tubería rota se encuentra en el otro lado, no en el código. Probablemente, el otro extremo (puede ser el cliente o el servidor) no entiende nuestro protocolo de longitud de palabra.

    Por ejemplo, no implementa eso correctamente. Si es algo similar a este código (proporcionado en la demostración del error), no lo hará.

    Ignoramos la respuesta devuelta por el read(). Además, suponga que llena el búfer; no se especifica para hacer eso, solo para enviar/transferir un byte.

  5. Otra solución es comprobar el código donde se produce la excepción de entrada/salida y envolverlo con un bloque try-catch para capturar la IOException. Entonces, depende de nosotros decidir cómo manejamos este escenario semiválido.

    Recuerde, este caso solo se aplica si la tubería rota se envuelve alrededor de la IOException.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Artículo relacionado - Java Exception