From 7b522286e7447a453e0880a32cbe3a4c7cceb52e Mon Sep 17 00:00:00 2001 From: liu Date: Tue, 5 Dec 2023 14:04:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95=E8=B8=A2?= =?UTF-8?q?=E4=B8=8B=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserController.java | 6 +++++ .../controller/WebSocketServer.java | 27 ++++++++++--------- .../usermanage/KickUserListener.java | 8 +++++- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java b/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java index 3eb554a4..0af12668 100644 --- a/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java +++ b/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java @@ -56,5 +56,11 @@ public class UserController { redisTemplate.expire(UserTokenConstant.TOKEN_CACHE + user.getId(), 1000 * 5L, TimeUnit.MILLISECONDS); } + @ApiOperation("踢用户下线") + @GetMapping("kickUser") + public void kickUser(String userId) { + redisTemplate.convertAndSend(UserTokenConstant.KICK_CHANNEL, userId); + } + } diff --git a/virtual-patient-web/src/main/java/com/supervision/controller/WebSocketServer.java b/virtual-patient-web/src/main/java/com/supervision/controller/WebSocketServer.java index d8ee4dfc..a6ae710a 100644 --- a/virtual-patient-web/src/main/java/com/supervision/controller/WebSocketServer.java +++ b/virtual-patient-web/src/main/java/com/supervision/controller/WebSocketServer.java @@ -1,16 +1,15 @@ package com.supervision.controller; +import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import javax.websocket.OnClose; -import javax.websocket.OnError; -import javax.websocket.OnOpen; -import javax.websocket.Session; +import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; -import java.util.concurrent.CopyOnWriteArraySet; +import java.security.Principal; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @Component @@ -22,14 +21,14 @@ public class WebSocketServer { private static final AtomicInteger onlineNum = new AtomicInteger(0); //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。 - private static final CopyOnWriteArraySet SESSION_POOL = new CopyOnWriteArraySet(); + private static final ConcurrentHashMap SESSION_POOL = new ConcurrentHashMap<>(); /** * 有客户端连接成功 */ @OnOpen public void onOpen(Session session, @PathParam(value = "uid") String uid) { - SESSION_POOL.add(session); + SESSION_POOL.put(uid, session); onlineNum.incrementAndGet(); log.info(uid + "加入webSocket!当前人数为" + onlineNum); } @@ -38,8 +37,8 @@ public class WebSocketServer { * 连接关闭调用的方法 */ @OnClose - public void onClose(Session session) { - SESSION_POOL.remove(session); + public void onClose(Session session, @PathParam(value = "uid") String uid) { + SESSION_POOL.remove(uid); int cnt = onlineNum.decrementAndGet(); log.info("有连接关闭,当前连接数为:{}", cnt); } @@ -59,7 +58,7 @@ public class WebSocketServer { * 群发消息 */ public void broadCastInfo(String message) throws IOException { - for (Session session : SESSION_POOL) { + for (Session session : SESSION_POOL.values()) { if (session.isOpen()) { sendMessage(session, message); } @@ -76,7 +75,11 @@ public class WebSocketServer { } // 实现一个方法用于踢下线用户 - public void kickUser(String userId) { - SESSION_POOL.removeIf(session -> session.getUserPrincipal().getName().equals(userId)); + public void kickUser(String userId) throws IOException { + log.info("踢用户{}下线", userId); + Session session = SESSION_POOL.get(userId); + if (ObjectUtil.isNotEmpty(session)) { + session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "用户被踢下线")); + } } } diff --git a/virtual-patient-web/src/main/java/com/supervision/usermanage/KickUserListener.java b/virtual-patient-web/src/main/java/com/supervision/usermanage/KickUserListener.java index 29c8fa3f..b2fc923e 100644 --- a/virtual-patient-web/src/main/java/com/supervision/usermanage/KickUserListener.java +++ b/virtual-patient-web/src/main/java/com/supervision/usermanage/KickUserListener.java @@ -8,6 +8,8 @@ import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; import org.springframework.stereotype.Component; +import java.io.IOException; + @Slf4j @Component @@ -20,6 +22,10 @@ public class KickUserListener implements MessageListener { public void onMessage(Message message, byte[] pattern) { String userId = message.toString(); log.info("Redis的Channel:{}收到踢用户下线消息:{}", UserTokenConstant.KICK_CHANNEL, userId); - webSocketServer.kickUser(userId); + try { + webSocketServer.kickUser(userId); + } catch (IOException e) { + throw new RuntimeException(e); + } } }