diff --git a/basic-interface/src/main/java/ink/wgink/interfaces/manager/IWebSocketUserSessionManager.java b/basic-interface/src/main/java/ink/wgink/interfaces/manager/IWebSocketUserSessionManager.java index 8eb125b7..f1361068 100644 --- a/basic-interface/src/main/java/ink/wgink/interfaces/manager/IWebSocketUserSessionManager.java +++ b/basic-interface/src/main/java/ink/wgink/interfaces/manager/IWebSocketUserSessionManager.java @@ -59,7 +59,7 @@ public interface IWebSocketUserSessionManager { * @param clientName 客户端名称 * @return */ - WebSocketSession getOnlineUser(String userId, String clientName); + List listOnlineUser(String userId, String clientName); /** * 在线会话列表 diff --git a/basic-pojo/src/main/java/ink/wgink/pojo/session/WebSocketSession.java b/basic-pojo/src/main/java/ink/wgink/pojo/session/WebSocketSession.java index 348162c7..84b92783 100644 --- a/basic-pojo/src/main/java/ink/wgink/pojo/session/WebSocketSession.java +++ b/basic-pojo/src/main/java/ink/wgink/pojo/session/WebSocketSession.java @@ -85,4 +85,23 @@ public class WebSocketSession implements Serializable { public void setUpdateTime(Long updateTime) { this.updateTime = updateTime; } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"sessionId\":\"") + .append(sessionId).append('\"'); + sb.append(",\"userId\":\"") + .append(userId).append('\"'); + sb.append(",\"clientName\":\"") + .append(clientName).append('\"'); + sb.append(",\"channelId\":\"") + .append(channelId).append('\"'); + sb.append(",\"channel\":") + .append(channel); + sb.append(",\"updateTime\":") + .append(updateTime); + sb.append('}'); + return sb.toString(); + } } diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/app/WebSocketClientAppController.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/app/WebSocketClientAppController.java index f8fb23ac..de64fc73 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/app/WebSocketClientAppController.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/app/WebSocketClientAppController.java @@ -30,6 +30,7 @@ public class WebSocketClientAppController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @GetMapping("login/{clientName}") public SuccessResultData login(@RequestHeader("token") String token, @PathVariable("clientName") String clientName) { + System.out.println(">>>> token:" + token); String sessionId = webSocketClientService.login(token, clientName); return new SuccessResultData<>(sessionId); } diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/WebSocketClientServiceImpl.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/WebSocketClientServiceImpl.java index deed8423..cc0cc688 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/WebSocketClientServiceImpl.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/WebSocketClientServiceImpl.java @@ -36,8 +36,11 @@ public class WebSocketClientServiceImpl extends DefaultBaseService implements IW * @param clientName 客户端名称 * @return */ - private String initSession(String userId, String clientName) { + private synchronized String initSession(String userId, String clientName) { String sessionId = UUIDUtil.getUUID(); + // 通知下线 + WebSocketChannelManager.getInstance().logout(userId, clientName); + System.out.println(">>>>>>>> sessionId: " + sessionId); WebSocketChannelManager.getInstance().init(userId, sessionId, clientName); return sessionId; } diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/enums/MessageTypeEnum.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/enums/MessageTypeEnum.java index ec478ec9..c0458f65 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/enums/MessageTypeEnum.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/enums/MessageTypeEnum.java @@ -13,6 +13,7 @@ package ink.wgink.module.instantmessage.websocket.enums; public enum MessageTypeEnum { REGISTER(1000, "注册消息,body 为 RegisterBody 的 JSON 字符串"), + LOGOUT(1001, "注销"), MESSAGE(2001, "文本消息"), MESSAGE_HREF(2002, "链接消息"), diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/manager/DefaultWebSocketUserSessionManager.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/manager/DefaultWebSocketUserSessionManager.java index c071e2b5..304dfe49 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/manager/DefaultWebSocketUserSessionManager.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/manager/DefaultWebSocketUserSessionManager.java @@ -27,19 +27,14 @@ public class DefaultWebSocketUserSessionManager implements IWebSocketUserSession @Override public void init(String userId, String sessionId, String clientName) { - WebSocketSession onlineUser = getOnlineUser(userId, clientName); - if (onlineUser == null) { - onlineUser = new WebSocketSession(); - onlineUser.setUserId(userId); - onlineUser.setClientName(clientName); - // 更新到session队列中 - List webSocketSessions = listOnlineUser(userId); - webSocketSessions.add(onlineUser); - webSocketUserMap.put(userId, webSocketSessions); - } - // 更新最后时间 + WebSocketSession onlineUser = new WebSocketSession(); + onlineUser.setUserId(userId); + onlineUser.setClientName(clientName); onlineUser.setSessionId(sessionId); onlineUser.setUpdateTime(System.currentTimeMillis()); + List webSocketSessions = listOnlineUser(userId); + webSocketSessions.add(onlineUser); + webSocketUserMap.put(userId, webSocketSessions); } @Override @@ -85,20 +80,21 @@ public class DefaultWebSocketUserSessionManager implements IWebSocketUserSession } @Override - public WebSocketSession getOnlineUser(String userId, String clientName) { + public List listOnlineUser(String userId, String clientName) { if (StringUtils.isBlank(userId) || StringUtils.isBlank(clientName)) { - return null; + return new ArrayList<>(); } List webSocketSessions = listOnlineUser(userId); if (webSocketSessions.isEmpty()) { - return null; + return webSocketSessions; } + List clientNameWebSocketSessions = new ArrayList<>(); for (WebSocketSession webSocketSession : webSocketSessions) { if (StringUtils.equals(clientName, webSocketSession.getClientName())) { - return webSocketSession; + clientNameWebSocketSessions.add(webSocketSession); } } - return null; + return clientNameWebSocketSessions; } @Override diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/manager/WebSocketChannelManager.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/manager/WebSocketChannelManager.java index 4bc64129..a6ca4ff6 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/manager/WebSocketChannelManager.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/websocket/manager/WebSocketChannelManager.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import ink.wgink.exceptions.websocket.SessionException; import ink.wgink.interfaces.manager.IWebSocketChannelManager; import ink.wgink.interfaces.manager.IWebSocketUserSessionManager; +import ink.wgink.module.instantmessage.websocket.enums.MessageTypeEnum; import ink.wgink.module.instantmessage.websocket.pojo.WebSocketClientMessage; import ink.wgink.pojo.session.WebSocketSession; import ink.wgink.properties.websocket.WebSocketProperties; @@ -49,6 +50,27 @@ public class WebSocketChannelManager implements IWebSocketChannelManager { webSocketUserSessionManager.init(userId, sessionId, clientName); } + /** + * 登出 + * + * @param userId + * @param clientName + */ + public void logout(String userId, String clientName) { + List webSocketSessions = webSocketUserSessionManager.listOnlineUser(userId, clientName); + if (webSocketSessions.isEmpty()) { + return; + } + WebSocketClientMessage webSocketClientMessage = new WebSocketClientMessage(); + webSocketClientMessage.setSystem(true); + webSocketClientMessage.setType(MessageTypeEnum.LOGOUT.getValue()); + webSocketClientMessage.setFrom(WebSocketChannelManager.FORM_SYSTEM); + webSocketClientMessage.setTo(userId); + webSocketSessions.forEach(webSocketSession -> { + sendText(webSocketSession.getChannel(), webSocketClientMessage); + }); + } + /** * 添加通道,绑定通道与会话 * @@ -91,8 +113,8 @@ public class WebSocketChannelManager implements IWebSocketChannelManager { * @param clientName 客户端名称 * @return */ - public WebSocketSession getOnlineUser(String userId, String clientName) { - return webSocketUserSessionManager.getOnlineUser(userId, clientName); + public List listOnlineUser(String userId, String clientName) { + return webSocketUserSessionManager.listOnlineUser(userId, clientName); } /**