聊天室信息发送
This commit is contained in:
parent
0a1f878c6f
commit
666847f482
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
// .id(userInfo.getId())
|
||||||
|
// .nickname(userInfo.getNickname())
|
||||||
|
// .username(userInfo.getUsername())
|
||||||
|
// .message(message)
|
||||||
|
// .build();
|
||||||
|
|
||||||
UserMessageVo messageVo = UserMessageVo.builder()
|
UserMessageVo messageVo = UserMessageVo.builder()
|
||||||
.id(userId)
|
|
||||||
.message(message)
|
.message(message)
|
||||||
.build();
|
.build();
|
||||||
String text = JSONUtil.toJsonStr(messageVo);
|
String text = JSONUtil.toJsonStr(messageVo);
|
||||||
this.sendMessage(text, sendSession);
|
ROOM_SESSION_MAP.get(roomId).stream().map(SESSION_CACHE::get).filter(Objects::nonNull)
|
||||||
}
|
.forEach(v -> this.sendMessage(text, v));
|
||||||
return;
|
// log.info("服务端响应消息成功,接收的User ID:{},响应内容:{}", userId, text);
|
||||||
}
|
|
||||||
Optional<RoomUserVo> userVo = room.getUserList().stream().filter(v -> v.getId().equals(userId)).findFirst();
|
|
||||||
if (!userVo.isPresent()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue