клиент spring websocket не обнаруживает потерю сетевого подключения

#spring #spring-boot #spring-websocket #java-websocket

Вопрос:

Клиент Spring @ClientEndpoint websocket не обнаруживает отключение от сети из-за отсоединения кабеля. Я также внедрил механизм пинг-понга. Может кто-нибудь, пожалуйста, помочь мне разобраться в том, что происходит? Однако я вижу следующее исключение после повторного подключения кабеля, к вашему сведению, все настройки по умолчанию. Кроме того, я подключаюсь к сторонней удаленной конечной точке, где нет никакого контроля.

 xxxxxException: closed with code : CLOSED_ABNORMALLY reason: CloseReason: code [1006], reason [java.io.IOException: Connection reset by peer]  at 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("Connected to the server");  this.session = session;  }   @OnClose  public void close(Session session, CloseReason closeReason) {  System.out.println("connection closed "   closeReason.getReasonPhrase());  }   @OnError  public void error(Session session, Throwable t) {  System.out.println(session.getId());  System.out.println("Error in connection "   t.getMessage());  }   @OnMessage  public void message(Session session, String message) {  System.out.println("message received: "   message   " "   i  );  }   public void send(String message){  try {  if(session.isOpen()) {  this.session.getBasicRemote().sendPing(ByteBuffer.wrap(message.getBytes()));  System.out.println("socket is open "   i  );  } else {  System.out.println("socket closed");  }  } catch (IOException e) {  e.printStackTrace();  }  } }  
  @Component public class ClientApp implements ApplicationListenerlt;ApplicationReadyEventgt; {   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);  }  } }  

Ответ №1:

Эту проблему можно решить, добавив приведенный ниже код в WSClient .

 @OnMessage public void pongMessage(Session session, PongMessage msg) {  LOGGER.debug("Pong message received: "   Instant.now());  //schedule a timeout task, and raise an event or so if timed out. }  

Приведенный выше фрагмент кода будет вызван, когда удаленная конечная точка отправит сообщение pong в качестве ответа на отправленное сообщение ping. В принципе , будет два метода с аннотациями @OnMessage , один для получения полезной нагрузки пользовательского сообщения, а другой для полезной нагрузки сообщений, отправленных платформой.