From 2f3f5806c355b043270937ab6fd5c91b2adee235 Mon Sep 17 00:00:00 2001 From: wzp Date: Tue, 17 Dec 2024 11:43:30 +0800 Subject: [PATCH] feat: adding all ping pong function --- .../clubs/controller/ChessController.java | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/mmga/clubs/controller/ChessController.java b/src/main/java/org/mmga/clubs/controller/ChessController.java index ed1edaf..ae8d01e 100644 --- a/src/main/java/org/mmga/clubs/controller/ChessController.java +++ b/src/main/java/org/mmga/clubs/controller/ChessController.java @@ -21,6 +21,7 @@ import org.mmga.clubs.service.UserService; import org.mmga.clubs.utils.JwtUtils; import org.mmga.clubs.utils.WebSocketUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.lang.reflect.Field; @@ -38,6 +39,7 @@ public class ChessController { private static final ConcurrentHashMap sessions = new ConcurrentHashMap<>(); private static final ConcurrentHashMap users = new ConcurrentHashMap<>(); private static final ConcurrentHashMap rooms = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap pingPong = new ConcurrentHashMap<>(); private static JwtUtils jwtUtils; private static UserService userService; @@ -80,9 +82,6 @@ public class ChessController { users.put(sessionId, user); sessions.put(sessionId, session); isLogin = true; - for (String s : messageQueue) { - this.onMessage(s, session); - } if (existsUser != null) { users.remove(existsUser); Room roomByPlayer = getRoomByPlayer(existsUser); @@ -94,19 +93,19 @@ public class ChessController { Session remove = sessions.remove(existsUser); remove.close(); } - ByteBuf buffer = Unpooled.buffer(); - buffer.writeLong(System.currentTimeMillis()); - session.getAsyncRemote().sendPing(buffer.nioBuffer()); + for (String s : messageQueue) { + this.onMessage(s, session); + } } @OnMessage public void onPong(PongMessage pongMessage, Session session) { - System.out.println(pongMessage); ByteBuffer applicationData = pongMessage.getApplicationData(); ByteBuf byteBuf = Unpooled.copiedBuffer(applicationData); - long l = byteBuf.readLong(); - System.out.println(l); + long l = System.currentTimeMillis() - byteBuf.readLong(); + log.info("client sent pong response, latency is {}ms", l); + pingPong.put(session, true); } @OnMessage @@ -217,4 +216,18 @@ public class ChessController { sessions.remove(sessionId); users.remove(sessionId); } + + @SneakyThrows + @Scheduled(fixedDelay = 10000) + public static void connectionManager() { + for (Session value : sessions.values()) { + if (!pingPong.getOrDefault(value, true)) { + value.close(); + continue; + } + pingPong.put(value, false); + log.info("send ping to session {}", value.getId()); + value.getAsyncRemote().sendPing(Unpooled.buffer().writeLong(System.currentTimeMillis()).nioBuffer()); + } + } }