yl-backend/src/main/java/com/guwan/backend/websocket/LiveWebSocketHandler.java

82 lines
2.8 KiB
Java
Raw Normal View History

2024-12-08 18:53:34 +08:00
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<String, Set<WebSocketSession>> roomSessions = new ConcurrentHashMap<>();
private static final Map<String, WebSocketSession> 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<WebSocketSession> sessions = roomSessions.get(roomId);
if (sessions != null) {
sessions.forEach(session -> {
try {
session.sendMessage(message);
} catch (IOException e) {
log.error("发送消息失败", e);
}
});
}
}
}