聊天室信息发送

This commit is contained in:
chanbook 2022-08-06 21:17:30 +08:00
parent 0a1f878c6f
commit 666847f482
3 changed files with 63 additions and 57 deletions

View File

@ -12,6 +12,7 @@ import java.util.Collection;
public class UserDetailsImpl implements UserDetails { public class UserDetailsImpl implements UserDetails {
private Long id; private Long id;
private String username; private String username;
private String nickName;
private String password; private String password;
@Override @Override

View File

@ -33,7 +33,9 @@ public class UserDetailsServiceImpl implements UserDetailsService {
return UserDetailsImpl.builder() return UserDetailsImpl.builder()
.id(user.getId()) .id(user.getId())
.username(user.getUsername()) .username(user.getUsername())
.nickName(user.getNickname())
.password(new BCryptPasswordEncoder().encode(user.getPassword())) .password(new BCryptPasswordEncoder().encode(user.getPassword()))
.build(); .build();
} }
} }

View File

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