#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
, один для получения полезной нагрузки пользовательского сообщения, а другой для полезной нагрузки сообщений, отправленных платформой.