Solucione Java.Net.SocketException: restablecimiento de conexión en Java

Muhammad Zeeshan 12 octubre 2023
  1. la java.net.SocketException en Java
  2. Causas de la java.net.SocketException: restablecimiento de la conexión en Java
  3. Reproduzca el error java.net.SocketException: restablecimiento de la conexión e identifique sus causas en Java
  4. Solucione el error java.net.SocketException: restablecimiento de la conexión en Java
Solucione Java.Net.SocketException: restablecimiento de conexión en Java

El artículo de hoy discutirá las razones y las soluciones para el error java.net.SocketException: restablecimiento de la conexión que puede ocurrir en Java. Finalmente, veremos cómo podemos erradicar el error java.net.SocketException: Connection reset de Java.

la java.net.SocketException en Java

SocketException es la subclase de IOException. Su estatus como excepción comprobada está garantizado.

Al intentar abrir o acceder a un socket, la excepción más genérica que puede ocurrir indica que hay un problema. Obtendrá el siguiente error si observa el lado del servidor:

java.net.SocketException : Connection reset

Causas de la java.net.SocketException: restablecimiento de la conexión en Java

Java.net.SocketException: Restablecimiento de la conexión se lanza en el servidor cuando el cliente finaliza la conexión al socket antes de que la respuesta pueda enviarse de vuelta a través del socket. Supongamos que puede cerrar el navegador antes de que se obtenga la respuesta del servidor.

Los paquetes TCP RST son la forma que tiene el lado remoto de informarle que la conexión en la que se transmitió el último paquete TCP no se reconoce. Un Restablecimiento de la conexión indica que se recibió correctamente un TCP RST.

Esto podría deberse a que la conexión ya no está activa. Después de todo, el puerto está cerrado o por otras razones.

Una definición simple de un paquete de reinicio no contiene contenido y tiene el bit RST establecido en las banderas del encabezado TCP. Las siguientes son algunas de las razones por las que puede ocurrir el error java.net.SocketException: restablecimiento de la conexión:

  1. Como resultado de recibir un comando de cerrar desde un sistema remoto, el socket TCP se ha cerrado.
  2. Esto también puede deberse a que el servidor pone en cola una gran cantidad de solicitudes, lo que hace que se agote el tiempo de espera de la solicitud antes de que el cliente pueda verla. También puede comprobar el estado y los registros del servidor para ver si se ha producido una carga excesiva.
  3. Cerrar un socket con datos no leídos en el búfer de recepción del socket también puede generar este error.
  4. La conexión se ha restablecido intencionalmente en el otro extremo. Si bien esto es raro e inapropiado para el software de aplicación, el software comercial no es raro.
  5. El protocolo de la aplicación es incorrecto o intentó escribir en una conexión que había terminado antes de que usted terminara.

Reproduzca el error java.net.SocketException: restablecimiento de la conexión e identifique sus causas en Java

Código de ejemplo (archivo Server.java):

package com.demobrokenpipe;

import java.io.*;
import java.net.*;

public class Server {
  public static void main(String[] args) throws Exception {
    ServerSocket socket = new ServerSocket(6666);
    System.out.println("The Server Is Initialized");
    Socket conn = socket.accept();
    System.out.println("A Request Is Received");
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    System.exit(1);
    conn.close();
  }
}

Código de ejemplo (archivo Client.java):

package com.demobrokenpipe;

import java.io.*;
import java.net.*;

public class Client {
  public static void main(String argv[]) throws Exception {
    Socket socket = new Socket("localhost", 6666);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    out.write("Hi");
    System.out.println("Incorrect String");
    BufferedReader bufferReader =
        new BufferedReader(new InputStreamReader(socket.getInputStream()));
    System.out.println(bufferReader.read());
  }
}

Aquí tenemos dos clases, Server.java y Client.java, que se conectan al número de puerto 6666. Abrimos dos terminales y ejecutamos ambos archivos para comunicarse entre el cliente y el servidor, pero imprime un mensaje y un error de la siguiente manera.

Error de descripción:

Incorrect String
Exception in thread "main" java.net.SocketException: Connection reset

Entendamos el error pasando por Socket, SocketException y “SocketException: reinicio de conexión” que conducirán a las causas de este error.

Usamos sockets para hacer una conexión exitosa en dos o más programas para comunicarse entre sí usando la misma red. En nuestro caso, tenemos dos programas, Client.java y Server.java.

Al usar Sockets, obtenemos una interfaz para comunicarnos a través de la pila de protocolos de red y permitir que los programas compartan mensajes en la misma red.

En palabras simples, podemos decir que los Sockets son los puntos finales en las comunicaciones a través de una red. Por lo general, el servidor de socket tiene varios subprocesos que pueden aceptar solicitudes de conexión de socket enviadas por diferentes clientes.

La SocketException es la clase secundaria de IOException, por lo que es una excepción comprobada. Ocurre cuando intentamos acceder o abrir el socket. Eche un vistazo a la jerarquía de excepciones completa para los errores SocketException.

Jerarquía de excepción completa:

Arreglar el restablecimiento de la conexión Java Net SocketException en java - jerarquía de excepciones

Cada vez que el cliente cierra la conexión del socket, se produce una SocketException en el lado del servidor porque la respuesta aún no se devolvió a través de ese socket. Si, lo tienes bien.

Obtenemos el error java.net.SocketException: restablecimiento de la conexión en el lado del servidor cuando el cliente cierra la conexión del socket antes de recibir la respuesta completa.

Aquí, Restablecimiento de la conexión significa que el punto final remoto le informa que no se reconoce la conexión en la que se envió el último paquete TCP. Puede haber varias razones para esto.

Encontrémoslos a continuación:

  1. El usuario cierra el navegador web antes de obtener la respuesta por completo.

  2. Lo más común es que la conexión que intentamos escribir se haya cerrado normalmente. También podemos decir que hay un error de protocolo de la aplicación.

  3. Otra posibilidad es que el puerto requerido ya no esté abierto. También vemos este error cuando un cliente cierra el socket mientras los datos no leídos todavía están en un búfer de recepción de socket.

  4. Si es un usuario de Windows, puede encontrarlo como “software provocó un aborto de conexión”. Los novatos lo confunden con Restablecer conexión.

    Recuerde, ambos no son lo mismo. El software provocó un aborto de conexión ocurre cuando tenemos algunos problemas de red mientras enviamos desde nuestro extremo.

  5. Otra situación es usar un método de Java Socket llamado setSoTimeout() que habilita/deshabilita la opción SO_TIMEOUT pasando un valor de tiempo de espera que debe ser mayor que 0. Pasar 0 también es una razón que da como resultado el error SocketException: Restablecimiento de la conexión.

Ahora, el punto es que ¿estamos también cerrando la conexión en el archivo Client.java? Encontremos eso a continuación.

Solucione el error java.net.SocketException: restablecimiento de la conexión en Java

Si nos enfrentamos a este error como cliente al conectarnos con el servidor, podemos solucionarlo realizando cualquiera de las siguientes acciones:

  1. Asegúrese de que el servidor se ejecute a través de telnet en un puerto de host. Este puerto es donde se ejecuta el servidor.
  2. Confirme si se reinicia un servidor.
  3. Evalúe si el mismo servidor conmuta por error a un host diferente.

Además, podemos avanzar hacia la solución si superamos las razones descritas en la sección anterior. En nuestro caso, eliminar System.exit(1) solucionó el error porque estaba saliendo del sistema y cerrando el programa.

Código de ejemplo (archivo Server.java):

import java.io.*;
import java.net.*;

public class Server {
  public static void main(String[] args) throws Exception {
    ServerSocket socket = new ServerSocket(6666);
    System.out.println("The Server Is Initialized");
    Socket conn = socket.accept();
    System.out.println("A Request Is Received");
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    System.out.println(reader.readLine());
    conn.close();
  }
}

Código de ejemplo (archivo Client.java):

import java.io.*;
import java.net.*;

public class Client {
  public static void main(String argv[]) throws Exception {
    Socket socket = new Socket("localhost", 6666);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    out.write("Hi");
    System.out.println("Incorrect String");
    BufferedReader bufferReader =
        new BufferedReader(new InputStreamReader(socket.getInputStream()));
    System.out.println(bufferReader.read());
  }
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

Artículo relacionado - Java Error