package com.guwan.backend.websocket; import com.alibaba.fastjson.JSON; import com.guwan.backend.entity.LiveMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; import java.io.IOException; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashSet; @Slf4j @Component public class LiveWebSocketHandler extends TextWebSocketHandler { private static final Map> roomSessions = new ConcurrentHashMap<>(); private static final Map userSessions = new ConcurrentHashMap<>(); @Override public void afterConnectionEstablished(WebSocketSession session) { String roomId = getRoomId(session); String userId = getUserId(session); // 加入房间 roomSessions.computeIfAbsent(roomId, k -> new ConcurrentHashSet<>()).add(session); userSessions.put(userId, session); // 广播进入消息 broadcastMessage(roomId, createEnterMessage(userId)); } @Override public void handleTextMessage(WebSocketSession session, TextMessage message) { String roomId = getRoomId(session); LiveMessage liveMessage = JSON.parseObject(message.getPayload(), LiveMessage.class); // 处理不同类型的消息 switch (liveMessage.getType()) { case "CHAT": broadcastMessage(roomId, message); break; case "GIFT": handleGiftMessage(roomId, liveMessage); break; case "LIKE": handleLikeMessage(roomId, liveMessage); break; } } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { String roomId = getRoomId(session); String userId = getUserId(session); // 离开房间 roomSessions.get(roomId).remove(session); userSessions.remove(userId); // 广播离开消息 broadcastMessage(roomId, createLeaveMessage(userId)); } private void broadcastMessage(String roomId, TextMessage message) { Set sessions = roomSessions.get(roomId); if (sessions != null) { sessions.forEach(session -> { try { session.sendMessage(message); } catch (IOException e) { log.error("发送消息失败", e); } }); } } }