diff --git a/src/main/java/com/zhangshu/chat/demo/config/UserDetailsImpl.java b/src/main/java/com/zhangshu/chat/demo/config/UserDetailsImpl.java index ebfe6e4..283bc6d 100644 --- a/src/main/java/com/zhangshu/chat/demo/config/UserDetailsImpl.java +++ b/src/main/java/com/zhangshu/chat/demo/config/UserDetailsImpl.java @@ -12,6 +12,7 @@ import java.util.Collection; public class UserDetailsImpl implements UserDetails { private Long id; private String username; + private String nickName; private String password; @Override diff --git a/src/main/java/com/zhangshu/chat/demo/service/UserDetailsServiceImpl.java b/src/main/java/com/zhangshu/chat/demo/service/UserDetailsServiceImpl.java index 7c09db1..7d43f72 100644 --- a/src/main/java/com/zhangshu/chat/demo/service/UserDetailsServiceImpl.java +++ b/src/main/java/com/zhangshu/chat/demo/service/UserDetailsServiceImpl.java @@ -33,7 +33,9 @@ public class UserDetailsServiceImpl implements UserDetailsService { return UserDetailsImpl.builder() .id(user.getId()) .username(user.getUsername()) + .nickName(user.getNickname()) .password(new BCryptPasswordEncoder().encode(user.getPassword())) .build(); } + } diff --git a/src/main/java/com/zhangshu/chat/demo/websocket/ChatRoom.java b/src/main/java/com/zhangshu/chat/demo/websocket/ChatRoom.java index de2a7f9..b5eaaa7 100644 --- a/src/main/java/com/zhangshu/chat/demo/websocket/ChatRoom.java +++ b/src/main/java/com/zhangshu/chat/demo/websocket/ChatRoom.java @@ -4,28 +4,29 @@ import cn.hutool.cache.Cache; import cn.hutool.cache.CacheUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; +import com.zhangshu.chat.demo.config.UserDetailsImpl; import com.zhangshu.chat.demo.entity.Room; import com.zhangshu.chat.demo.service.RoomCache; import com.zhangshu.chat.demo.vo.RoomUserVo; import com.zhangshu.chat.demo.vo.UserMessageVo; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; -import java.util.Iterator; -import java.util.Objects; -import java.util.Optional; +import java.security.Principal; +import java.util.*; @Slf4j @Component -@ServerEndpoint("/chat/room/{userId}") +@ServerEndpoint("/chat/room/{roomId}") public class ChatRoom { - private final Cache sessionUserCache = CacheUtil.newFIFOCache(16); - private final Cache sessionCache = CacheUtil.newFIFOCache(16); - private final Cache userSessionCache = CacheUtil.newFIFOCache(16); + private String roomId; + private final static Map> ROOM_SESSION_MAP = new HashMap<>(); + private final static Cache SESSION_CACHE = CacheUtil.newFIFOCache(16); public static RoomCache getRoomCache() { return SpringUtil.getBean(RoomCache.class); @@ -37,16 +38,23 @@ public class ChatRoom { * @param session 客户端连接对象 */ @OnOpen - public void onOpen(Session session, @PathParam("userId") Long userId) { -// if (!getRoomCache().isExistUser(userId)) { -// sendMessage("用户不在房间中,拒绝连接", session); + public void onOpen(Session session, @PathParam("roomId") String roomId) { +// if (getRoomCache().createSuccess(roomId)) { +// sendRefuseConnectionMessage(session); +// return; +// } +// UserDetailsImpl userInfo = (UserDetailsImpl) session.getUserPrincipal(); +// if (Objects.isNull(userInfo) || !getRoomCache().isExistUser(userInfo.getId())) { +// sendRefuseConnectionMessage(session); // return; // } String sessionId = session.getId().toLowerCase(); - sessionUserCache.put(sessionId, userId); - sessionCache.put(sessionId, session); - userSessionCache.put(userId, sessionId); - log.info("客户端连接建立成功,User ID:{},当前在线数:{}", userId, sessionUserCache.size()); + SESSION_CACHE.put(sessionId, session); + if (StringUtils.isBlank(this.roomId)) { + this.roomId = roomId; + } + ROOM_SESSION_MAP.computeIfAbsent(roomId, k -> new ArrayList<>()).add(sessionId); +// log.info("客户端连接建立成功,User ID:{},当前在线数:{}", roomId, sessionCache.size()); } /** @@ -59,43 +67,28 @@ public class ChatRoom { public void onMessage(String message, Session session) { log.info("服务端接收消息成功,消息内容:{}", message); // 处理消息,并响应给客户端 - String sessionId = session.getId().toLowerCase(); - Long userId = sessionUserCache.get(sessionId); - if (Objects.isNull(userId)) { - return; - } - Room room = getRoomCache().getRoomByUser(userId); - if (Objects.isNull(room)) { - for (Session sendSession : sessionCache) { - UserMessageVo messageVo = UserMessageVo.builder() - .id(userId) - .message(message) - .build(); - String text = JSONUtil.toJsonStr(messageVo); - this.sendMessage(text, sendSession); - } - return; - } - Optional userVo = room.getUserList().stream().filter(v -> v.getId().equals(userId)).findFirst(); - if (!userVo.isPresent()) { - return; - } +// Room room = getRoomCache().get(this.roomId); +// if (Objects.isNull(room)) { +// return; +// } +// UserDetailsImpl userInfo = (UserDetailsImpl) session.getUserPrincipal(); +// if (Objects.isNull(userInfo)) { +// return; +// } +// UserMessageVo messageVo = UserMessageVo.builder() +// .id(userInfo.getId()) +// .nickname(userInfo.getNickname()) +// .username(userInfo.getUsername()) +// .message(message) +// .build(); + UserMessageVo messageVo = UserMessageVo.builder() - .id(userId) - .nickname(userVo.get().getNickname()) - .username(userVo.get().getUsername()) .message(message) .build(); String text = JSONUtil.toJsonStr(messageVo); - room.getUserList().stream() - .map(RoomUserVo::getId) - .map(userSessionCache::get) - .map(sessionCache::get) - .filter(Objects::nonNull) - .forEach(v -> { - this.sendMessage(text, v); - }); - log.info("服务端响应消息成功,接收的User ID:{},响应内容:{}", userId, text); + ROOM_SESSION_MAP.get(roomId).stream().map(SESSION_CACHE::get).filter(Objects::nonNull) + .forEach(v -> this.sendMessage(text, v)); +// log.info("服务端响应消息成功,接收的User ID:{},响应内容:{}", userId, text); } /** @@ -117,6 +110,10 @@ public class ChatRoom { } + private void sendRefuseConnectionMessage(Session session) { + this.sendMessage("拒绝连接", session); + } + /** * 关闭连接 * @@ -125,11 +122,14 @@ public class ChatRoom { @OnClose public void onClose(Session session) { String sessionId = session.getId().toLowerCase(); - Long userId = sessionUserCache.get(sessionId); - sessionUserCache.remove(sessionId); - sessionCache.remove(sessionId); - userSessionCache.remove(userId); - log.info("客户端连接关闭成功,User ID:{},当前在线数:{}", userId, sessionUserCache.size()); + SESSION_CACHE.remove(sessionId); + List sessionList = ROOM_SESSION_MAP.get(roomId); + if (sessionList.size() <= 1) { + ROOM_SESSION_MAP.remove(roomId); + } else { + sessionList.remove(sessionId); + } + log.info("客户端连接关闭成功,sessionId ID:{},当前在线数:{}", sessionId, sessionList.size()); } /** @@ -141,10 +141,13 @@ public class ChatRoom { @OnError public void onError(Session session, Throwable error) { String sessionId = session.getId().toLowerCase(); - Long userId = sessionUserCache.get(sessionId); - sessionUserCache.remove(sessionId); - sessionCache.remove(sessionId); - userSessionCache.remove(userId); - log.info("连接异常,User ID:{},error:{}", userId, error); + SESSION_CACHE.remove(sessionId); + List sessionList = ROOM_SESSION_MAP.get(roomId); + if (sessionList.size() <= 1) { + ROOM_SESSION_MAP.remove(roomId); + } else { + sessionList.remove(sessionId); + } + log.info("连接异常,sessionId ID:{},error:{}", sessionId, error); } }