es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El cliente de Websocket de Spring no detecta la pérdida de conexión de red.

El cliente de websocket @ClientEndpoint de Spring no detecta la desconexión de red debido a un desenchufe del cable. También he implementado un mecanismo de ping/pong. ¿Alguien puede ayudarme con lo que está sucediendo?

Sin embargo, veo la siguiente excepción después de volver a conectar el cable, para su información, todas las configuraciones están por defecto. Además, me estoy conectando a un punto final remoto de terceros donde no tengo ningún control.


xxxxxException: cerrado con el código: CLOSED_ABNORMALLY reason: CloseReason: código [1006], motivo [java.io.IOException: Connection reset by peer]
en xxxxxx.onClose(WSClient.java:xx)

@ClientEndpoint
public class WSClient {
private Session session;
private int i = 0;

@OnOpen
public void open(Session session) {
System.out.println(“Conectado al servidor”);
this.session = session;
}

@OnClose
public void close(Session session, CloseReason closeReason) {
System.out.println(“conexión cerrada ” + closeReason.getReasonPhrase());
}

@OnError
public void error(Session session, Throwable t) {
System.out.println(session.getId());
System.out.println(“Error en la conexión ” + t.getMessage());
}

@OnMessage
public void message(Session session, String message) {
System.out.println(“mensaje recibido: ” + message + ” ” + i++);
}

public void send(String message){
try {
if(session.isOpen()) {
this.session.getBasicRemote().sendPing(ByteBuffer.wrap(message.getBytes()));
System.out.println(“el socket está abierto ” + i++);
} else {
System.out.println(“socket cerrado”);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

@Component
public class ClientApp implements ApplicationListener {

private void startConnection() throws Exception {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
WSClient client = new WSClient();
container.connectToServer(client, new URI(“ws://wshost:8080/ping”));

while (true) {
    client.send("ping");
    TimeUnit.SECONDS.sleep(3);
}

}

@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
try {
startConnection();
} catch (Exception e) {
System.out.println(e);
}
}
}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema podría deberse al hecho de que el mecanismo de ping/pong implementado está enviando mensajes de ping, pero no está escuchando mensajes de pong desde el servidor. Por lo tanto, si el servidor no responde a un mensaje de ping, el cliente asume que la conexión sigue activa.

    Para solucionar esto, agregue un método @OnMessage a la clase WSClient que escuche mensajes de pong y agregue la lógica necesaria en el método send() para manejar el tiempo de espera si no se recibe un mensaje de pong dentro de un cierto período de tiempo. Además, considere utilizar la API WebSocket integrada para Java (javax.websocket) en lugar de Spring, ya que puede proporcionar más funcionalidades para manejar desconexiones de red.

Comments are closed.