package com.ruoyi.utils.websocket.util;
|
|
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.*;
|
import java.util.concurrent.*;
|
import java.util.regex.Matcher;
|
import java.util.regex.Pattern;
|
|
/**
|
* @ClassName WebSocketUtils
|
* @Description: websocket工具类
|
* @Author 刘苏义
|
* @Date 2023/1/27 7:46
|
* @Version 1.0
|
*/
|
@Slf4j
|
public final class WebSocketUtils {
|
|
// 存储 websocket session
|
public static final ConcurrentMap<String, Session> ONLINE_USER_SESSIONS = new ConcurrentHashMap<>();
|
//存储房间
|
public static final ConcurrentHashMap<String, Set<String>> ROOM_USER_SET = new ConcurrentHashMap<>();
|
|
/**
|
* @param session 用户 session
|
* @param message 发送内容
|
*/
|
public static void sendMessage(Session session, String message) {
|
if (session == null) {
|
return;
|
}
|
final RemoteEndpoint.Basic basic = session.getBasicRemote();
|
if (basic == null) {
|
return;
|
}
|
synchronized (session) {
|
try {
|
log.debug("发送消息:" + message);
|
session.getBasicRemote().sendText(message);
|
} catch (IOException e) {
|
log.error("sendMessage IOException ", e);
|
}
|
}
|
}
|
|
/**
|
* @param session 用户 session
|
* @param message 发送内容
|
*/
|
public static void sendMessage(Session session, Map message) {
|
if (session == null) {
|
return;
|
}
|
final RemoteEndpoint.Basic basic = session.getBasicRemote();
|
if (basic == null) {
|
return;
|
}
|
synchronized (session) {
|
try {
|
session.getBasicRemote().sendText(new JSONObject(message).toString());
|
} catch (IOException e) {
|
log.error("sendMessage IOException ", e);
|
}
|
}
|
}
|
|
public static void sendMessage(Session session, List message) {
|
if (session == null) {
|
return;
|
}
|
final RemoteEndpoint.Basic basic = session.getBasicRemote();
|
if (basic == null) {
|
return;
|
}
|
synchronized (session) {
|
try {
|
session.getBasicRemote().sendText(String.join(", ", message));
|
} catch (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 userId 用户id
|
* @param message 消息内容
|
* @author 刘苏义
|
* @date 2024/8/12 15:43
|
*/
|
public static void sendMessage(String userId,String message) {
|
WebSocketUtils.ONLINE_USER_SESSIONS.get(userId).getAsyncRemote().sendText(message);
|
}
|
/**
|
* 推送消息到其他客户端
|
*
|
* @param message
|
*/
|
public static void sendMessageAll(Map 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));
|
}
|
}
|