liusuyi
2024-07-17 2ab35000026ccd58238e6a504b1b5f79f8c262c3
ard-work/src/main/java/com/ruoyi/utils/websocket/util/WebSocketUtils.java
@@ -2,14 +2,15 @@
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
@@ -23,6 +24,8 @@
    // 存储 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
@@ -36,15 +39,16 @@
        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 发送内容
@@ -57,14 +61,15 @@
        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;
@@ -73,27 +78,63 @@
        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));
    }
}