| | |
| | | |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.web.socket.WebSocketSession; |
| | | |
| | | import javax.websocket.RemoteEndpoint; |
| | | import javax.websocket.Session; |
| | | import java.io.IOException; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | import java.util.concurrent.*; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | | /** |
| | | * @ClassName WebSocketUtils |
| | |
| | | |
| | | // 存储 websocket session |
| | | public static final Map<String, Session> ONLINE_USER_SESSIONS = new ConcurrentHashMap<>(); |
| | | //存储房间 |
| | | public static final ConcurrentHashMap<String, Set<String>> ROOM_USER_SET = new ConcurrentHashMap<>(); |
| | | |
| | | /** |
| | | * @param session 用户 session |
| | |
| | | if (basic == null) { |
| | | return; |
| | | } |
| | | synchronized(session) { |
| | | synchronized (session) { |
| | | try { |
| | | log.debug("发送消息:"+message); |
| | | log.debug("发送消息:" + message); |
| | | session.getBasicRemote().sendText(message); |
| | | } catch (IOException e) { |
| | | log.error("sendMessage IOException ",e); |
| | | log.error("sendMessage IOException ", e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @param session 用户 session |
| | | * @param message 发送内容 |
| | |
| | | if (basic == null) { |
| | | return; |
| | | } |
| | | synchronized(session) { |
| | | synchronized (session) { |
| | | try { |
| | | session.getBasicRemote().sendText(new JSONObject(message).toString()); |
| | | } catch (IOException e) { |
| | | log.error("sendMessage IOException ",e); |
| | | log.error("sendMessage IOException ", e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public static void sendMessage(Session session, List message) { |
| | | if (session == null) { |
| | | return; |
| | |
| | | if (basic == null) { |
| | | return; |
| | | } |
| | | synchronized(session) { |
| | | synchronized (session) { |
| | | try { |
| | | session.getBasicRemote().sendText( String.join(", ", message)); |
| | | session.getBasicRemote().sendText(String.join(", ", message)); |
| | | } catch (IOException e) { |
| | | log.error("sendMessage IOException ",e); |
| | | log.error("sendMessage IOException ", e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 推送消息到其他客户端 |
| | | * |
| | | * @param message |
| | | */ |
| | | public static void sendMessageAll(String message) { |
| | | ONLINE_USER_SESSIONS.forEach((sessionId, session) -> sendMessage(session, message)); |
| | | } |
| | | |
| | | /** |
| | | * 推送消息到其他客户端 |
| | | * |
| | | * @param message |
| | | */ |
| | | public static void sendMessageAll(Map message) { |
| | | JSONObject jsonObject=new JSONObject(message); |
| | | JSONObject jsonObject = new JSONObject(message); |
| | | ONLINE_USER_SESSIONS.forEach((sessionId, session) -> sendMessage(session, jsonObject.toString())); |
| | | } |
| | | |
| | | /** |
| | | * 推送消息到当前房间的其他客户端 |
| | | * |
| | | * @param message |
| | | */ |
| | | public static void sendRoomMessage(String roomId, String message) { |
| | | Set<String> userSet = ROOM_USER_SET.getOrDefault(roomId, new HashSet<>()); |
| | | userSet.stream().forEach(userId -> { |
| | | String regex = "^" + Pattern.quote(userId) + "_\\d+$"; |
| | | Pattern pattern = Pattern.compile(regex); |
| | | ONLINE_USER_SESSIONS.entrySet().stream().filter(entry -> { |
| | | Matcher matcher = pattern.matcher(entry.getKey()); |
| | | return matcher.matches(); |
| | | }).map(Map.Entry::getValue).forEach(session -> WebSocketUtils.sendMessage(session, message)); |
| | | }); |
| | | } |
| | | /** |
| | | * @Author 刘苏义 |
| | | * @Description 发送消息给userId_前缀的人 |
| | | * @Date 2024/7/16 10:24 |
| | | * @Param |
| | | * @return |
| | | */ |
| | | public static void sendMessagePrefix(String targetId, String message) { |
| | | String regex = "^" + Pattern.quote(targetId) + "_\\d+$"; |
| | | Pattern pattern = Pattern.compile(regex); |
| | | ONLINE_USER_SESSIONS.entrySet().stream().filter(entry -> { |
| | | Matcher matcher = pattern.matcher(entry.getKey()); |
| | | return matcher.matches(); |
| | | }).map(Map.Entry::getValue).forEach(session -> WebSocketUtils.sendMessage(session, message)); |
| | | } |
| | | } |