From 9f22f33a9aacbda58477d00029a490ea59090cf1 Mon Sep 17 00:00:00 2001 From: merlin Date: Mon, 23 Mar 2026 18:10:01 +0800 Subject: [PATCH] feat: add video websocket handler etc... --- readme.md | 1 + .../config/WebsocketConfig.java | 8 ++- .../config/security/WebsocketInterceptor.java | 4 ++ .../controller/PlayroomController.java | 18 +++++ .../myplayerbackend/entity/Playrooms.java | 2 + .../mapper/PlayroomMapper.java | 1 - .../service/impl/PlayroomsServiceImpl.java | 2 +- ...ndler.java => OnlineWebSocketHandler.java} | 11 ++-- ...ava => OnlineWebSocketSessionManager.java} | 2 +- .../websocket/PlayroomWebSocketHandler.java | 65 +++++++++++++++++++ .../PlayroomWebSocketSessionManager.java | 47 ++++++++++++++ .../websocket/WebSocketMessageConsumer.java | 9 ++- .../websocket/command/BaseCommandHandler.java | 2 + .../websocket/command/CommandDispatcher.java | 13 +++- .../command/CommandDispatcherVideo.java | 34 ++++++++++ .../websocket/command/impl/GroupMessage.java | 9 ++- .../websocket/command/impl/Heartbeat.java | 6 ++ .../utils/websocket/command/impl/Message.java | 9 ++- .../command/impl/PersonalNotify.java | 9 ++- .../utils/websocket/command/impl/Ping.java | 15 ++++- .../websocket/command/impl/SystemNotify.java | 9 ++- .../utils/websocket/command/impl/Typing.java | 9 ++- 22 files changed, 258 insertions(+), 27 deletions(-) create mode 100644 readme.md rename src/main/java/xin/merlin/myplayerbackend/utils/websocket/{CustomWebSocketHandler.java => OnlineWebSocketHandler.java} (90%) rename src/main/java/xin/merlin/myplayerbackend/utils/websocket/{WebSocketSessionManager.java => OnlineWebSocketSessionManager.java} (97%) create mode 100644 src/main/java/xin/merlin/myplayerbackend/utils/websocket/PlayroomWebSocketHandler.java create mode 100644 src/main/java/xin/merlin/myplayerbackend/utils/websocket/PlayroomWebSocketSessionManager.java create mode 100644 src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/CommandDispatcherVideo.java diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..cc71d8e --- /dev/null +++ b/readme.md @@ -0,0 +1 @@ +# 别忘记application.yaml \ No newline at end of file diff --git a/src/main/java/xin/merlin/myplayerbackend/config/WebsocketConfig.java b/src/main/java/xin/merlin/myplayerbackend/config/WebsocketConfig.java index 252d384..080e544 100644 --- a/src/main/java/xin/merlin/myplayerbackend/config/WebsocketConfig.java +++ b/src/main/java/xin/merlin/myplayerbackend/config/WebsocketConfig.java @@ -7,14 +7,17 @@ import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; import xin.merlin.myplayerbackend.config.security.WebsocketInterceptor; -import xin.merlin.myplayerbackend.utils.websocket.CustomWebSocketHandler; +import xin.merlin.myplayerbackend.utils.websocket.OnlineWebSocketHandler; +import xin.merlin.myplayerbackend.utils.websocket.PlayroomWebSocketHandler; @Configuration @EnableWebSocket @RequiredArgsConstructor public class WebsocketConfig implements WebSocketConfigurer { - private final CustomWebSocketHandler handler; + private final OnlineWebSocketHandler handler; + + private final PlayroomWebSocketHandler playroomHandler; private final WebsocketInterceptor interceptor; @@ -22,5 +25,6 @@ public class WebsocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(handler, "/ws/online").addInterceptors(interceptor).setAllowedOrigins("*"); + registry.addHandler(playroomHandler,"/ws/playroom").addInterceptors(interceptor).setAllowedOrigins("*"); } } diff --git a/src/main/java/xin/merlin/myplayerbackend/config/security/WebsocketInterceptor.java b/src/main/java/xin/merlin/myplayerbackend/config/security/WebsocketInterceptor.java index 0ce2cbe..1c57dca 100644 --- a/src/main/java/xin/merlin/myplayerbackend/config/security/WebsocketInterceptor.java +++ b/src/main/java/xin/merlin/myplayerbackend/config/security/WebsocketInterceptor.java @@ -45,9 +45,13 @@ public class WebsocketInterceptor implements HandshakeInterceptor { attributes.put("account", account); if (request instanceof ServletServerHttpRequest servletRequest) { String userName = servletRequest.getServletRequest().getParameter("name"); + String roomId = servletRequest.getServletRequest().getParameter("r_id"); if (userName != null) { attributes.put("name", userName); // 将u_name存储到Attributes中 } + if (roomId != null) { + attributes.put("r_id", roomId); + } } return true; diff --git a/src/main/java/xin/merlin/myplayerbackend/controller/PlayroomController.java b/src/main/java/xin/merlin/myplayerbackend/controller/PlayroomController.java index cb0c9fc..ab1de60 100644 --- a/src/main/java/xin/merlin/myplayerbackend/controller/PlayroomController.java +++ b/src/main/java/xin/merlin/myplayerbackend/controller/PlayroomController.java @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.*; import xin.merlin.myplayerbackend.entity.PlayroomInfo; import xin.merlin.myplayerbackend.entity.Playrooms; import xin.merlin.myplayerbackend.entity.UserInfo; +import xin.merlin.myplayerbackend.entity.http.PlayroomDetails; import xin.merlin.myplayerbackend.service.impl.PlayroomServiceImpl; import xin.merlin.myplayerbackend.service.impl.PlayroomsServiceImpl; import xin.merlin.myplayerbackend.utils.JwtUtil; @@ -121,4 +122,21 @@ public class PlayroomController { } } + @GetMapping("/detail/{r_id}") + Response getDetail(@RequestHeader("Authorization")String token,@PathVariable("r_id")Integer r_id){ + try{ + token = token.substring(7); + Integer id = jwtUtil.getId(token); + Integer role = isAdmin(id,r_id)?0:1; + PlayroomInfo playroomInfo = playroomService.getById(r_id); + Playrooms playrooms = new Playrooms(r_id,id,role); + return Response.success(ResultCode.SUCCESS,new PlayroomDetails(playroomInfo,playrooms)); + + }catch (Exception e){ + log.error(e.getMessage()); + return Response.fail(ResultCode.SERVER_ERROR); + } + } + + } diff --git a/src/main/java/xin/merlin/myplayerbackend/entity/Playrooms.java b/src/main/java/xin/merlin/myplayerbackend/entity/Playrooms.java index ab0e725..1253e22 100644 --- a/src/main/java/xin/merlin/myplayerbackend/entity/Playrooms.java +++ b/src/main/java/xin/merlin/myplayerbackend/entity/Playrooms.java @@ -4,10 +4,12 @@ package xin.merlin.myplayerbackend.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; @Data @TableName("playrooms") @AllArgsConstructor +@NoArgsConstructor public class Playrooms { private Integer r_id; private Integer id; diff --git a/src/main/java/xin/merlin/myplayerbackend/mapper/PlayroomMapper.java b/src/main/java/xin/merlin/myplayerbackend/mapper/PlayroomMapper.java index e016f0c..690352b 100644 --- a/src/main/java/xin/merlin/myplayerbackend/mapper/PlayroomMapper.java +++ b/src/main/java/xin/merlin/myplayerbackend/mapper/PlayroomMapper.java @@ -10,5 +10,4 @@ import java.util.List; @Mapper public interface PlayroomMapper extends BaseMapper { - List selectPlayroomDetails(@Param("userId") Integer id); } diff --git a/src/main/java/xin/merlin/myplayerbackend/service/impl/PlayroomsServiceImpl.java b/src/main/java/xin/merlin/myplayerbackend/service/impl/PlayroomsServiceImpl.java index 8b0cb01..f7f83c9 100644 --- a/src/main/java/xin/merlin/myplayerbackend/service/impl/PlayroomsServiceImpl.java +++ b/src/main/java/xin/merlin/myplayerbackend/service/impl/PlayroomsServiceImpl.java @@ -20,7 +20,7 @@ public class PlayroomsServiceImpl extends ServiceImpllambdaQuery().eq(Playrooms::getId,id).eq(Playrooms::getR_id,r_id)); - if (playrooms == null) return 1; + if (playrooms == null) return -1; else return playrooms.getRole(); } catch (Exception e) { log.error(e.getMessage()); diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/CustomWebSocketHandler.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/OnlineWebSocketHandler.java similarity index 90% rename from src/main/java/xin/merlin/myplayerbackend/utils/websocket/CustomWebSocketHandler.java rename to src/main/java/xin/merlin/myplayerbackend/utils/websocket/OnlineWebSocketHandler.java index 08b22dd..892a232 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/CustomWebSocketHandler.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/OnlineWebSocketHandler.java @@ -17,9 +17,9 @@ import xin.merlin.myplayerbackend.service.OnlineStatusService; @Slf4j @Component @RequiredArgsConstructor -public class CustomWebSocketHandler extends TextWebSocketHandler { +public class OnlineWebSocketHandler extends TextWebSocketHandler { - private final WebSocketSessionManager webSocketSessionManager; + private final OnlineWebSocketSessionManager sessionManager; private final RabbitTemplate rabbitTemplate; @@ -38,13 +38,14 @@ public class CustomWebSocketHandler extends TextWebSocketHandler { onlineStatusService.online(userId); - webSocketSessionManager.addSession(userId, session); + sessionManager.addSession(userId, session); log.info("用户 {} 已连接", userId); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String payload = message.getPayload(); + System.out.println(payload); rabbitTemplate.convertAndSend(RabbitMQConfig.WS_MESSAGE_QUEUE, payload); // JSONObject msg = JSON.parseObject(payload); @@ -72,14 +73,14 @@ public class CustomWebSocketHandler extends TextWebSocketHandler { onlineStatusService.offline(userId); - webSocketSessionManager.removeSession(userId); + sessionManager.removeSession(userId); log.info("用户 {} 已断开", userId); } @EventListener public void onShutdown(ContextClosedEvent event) { log.info("Shutting down... closing websocket sessions"); - webSocketSessionManager.closeAll(); + sessionManager.closeAll(); } diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/WebSocketSessionManager.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/OnlineWebSocketSessionManager.java similarity index 97% rename from src/main/java/xin/merlin/myplayerbackend/utils/websocket/WebSocketSessionManager.java rename to src/main/java/xin/merlin/myplayerbackend/utils/websocket/OnlineWebSocketSessionManager.java index 1ec73ed..bb9ffe7 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/WebSocketSessionManager.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/OnlineWebSocketSessionManager.java @@ -11,7 +11,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Component -public class WebSocketSessionManager { +public class OnlineWebSocketSessionManager { private static final Map websocketSessions = new ConcurrentHashMap<>(); diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/PlayroomWebSocketHandler.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/PlayroomWebSocketHandler.java new file mode 100644 index 0000000..64e6c5d --- /dev/null +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/PlayroomWebSocketHandler.java @@ -0,0 +1,65 @@ +package xin.merlin.myplayerbackend.utils.websocket; + +import com.alibaba.fastjson2.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.event.ContextClosedEvent; +import org.springframework.context.event.EventListener; +import org.springframework.data.redis.core.StringRedisTemplate; +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 xin.merlin.myplayerbackend.config.RabbitMQConfig; + +import java.time.LocalDateTime; + +@Slf4j +@Component +@RequiredArgsConstructor +public class PlayroomWebSocketHandler extends TextWebSocketHandler { + + private final PlayroomWebSocketSessionManager sessionManager; + + private final RabbitTemplate rabbitTemplate; + + private final StringRedisTemplate redis; + + private final String IN_ROOM_BASE_KEY = "room:"; + + @Override + public void afterConnectionEstablished(WebSocketSession session) throws Exception { + Integer userId = (Integer) session.getAttributes().get("id"); + String payload = "{\"cmd\": \"PING\", \"to\": "+ userId +", \"time\":\""+ LocalDateTime.now() +"\"}"; + sessionManager.addSession(userId, session); + rabbitTemplate.convertAndSend(RabbitMQConfig.WS_VIDEO_QUEUE,payload); + } + + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { + JSONObject payload = JSONObject.parseObject(message.getPayload()); + Integer userId = (Integer) session.getAttributes().get("id"); + if(payload.get("cmd").equals("PONG")) { + if(Boolean.TRUE.equals(redis.opsForSet().isMember(IN_ROOM_BASE_KEY + session.getAttributes().get("r_id") + ":", String.valueOf(userId)))){ + return; + } + redis.opsForSet().add(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id")+":", String.valueOf(userId)); + } + + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { + Integer userId = (Integer) session.getAttributes().get("id"); + redis.opsForSet().remove(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id")+":", userId.toString()); + sessionManager.removeSession(userId); + } + + @EventListener + public void onShutdown(ContextClosedEvent event) { + log.info("Shutting down... closing websocket sessions"); + sessionManager.closeAll(); + } +} diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/PlayroomWebSocketSessionManager.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/PlayroomWebSocketSessionManager.java new file mode 100644 index 0000000..dca1cc5 --- /dev/null +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/PlayroomWebSocketSessionManager.java @@ -0,0 +1,47 @@ +package xin.merlin.myplayerbackend.utils.websocket; + +import org.springframework.stereotype.Component; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Component +public class PlayroomWebSocketSessionManager { + + private static final Map websocketSessions = new ConcurrentHashMap<>(); + + public void addSession(Integer id, WebSocketSession session) {websocketSessions.put(id, session);} + + public WebSocketSession getSession(Integer id) {return websocketSessions.get(id);} + + public void removeSession(Integer id) {websocketSessions.remove(id);} + + public Map getSessions() {return websocketSessions;} + + public void sendToUser(Integer userId, String message) throws IOException { + WebSocketSession session = websocketSessions.get(userId); + if (session != null && session.isOpen()) { + session.sendMessage(new TextMessage(message)); + } + } + + public void broadcast(String message) throws IOException { + for (WebSocketSession session : websocketSessions.values()) { + if (session.isOpen()) { + session.sendMessage(new TextMessage(message)); + } + } + } + + public void closeAll() { + websocketSessions.forEach((uid, session) -> { + try { + session.close(CloseStatus.GOING_AWAY); + } catch (Exception ignored) {} + }); + } +} diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/WebSocketMessageConsumer.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/WebSocketMessageConsumer.java index 8f49df3..8da1e9a 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/WebSocketMessageConsumer.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/WebSocketMessageConsumer.java @@ -8,16 +8,19 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; import xin.merlin.myplayerbackend.config.RabbitMQConfig; import xin.merlin.myplayerbackend.utils.websocket.command.CommandDispatcher; +import xin.merlin.myplayerbackend.utils.websocket.command.CommandDispatcherVideo; @Slf4j @Component @RequiredArgsConstructor public class WebSocketMessageConsumer { - private final WebSocketSessionManager sessionManager; + private final OnlineWebSocketSessionManager sessionManager; private final CommandDispatcher commandDispatcher; + private final CommandDispatcherVideo commandDispatcherVideo; + @RabbitListener(queues = RabbitMQConfig.WS_MESSAGE_QUEUE) public void onMessage(String json) { try { @@ -33,8 +36,8 @@ public class WebSocketMessageConsumer { public void onVideoMessage(String json) { try { JSONObject msg = JSON.parseObject(json); - commandDispatcher.dispatch(msg); - + commandDispatcherVideo.dispatch(msg); + System.out.println("sending video message"); } catch (Exception e) { log.info(e.getMessage()); } diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/BaseCommandHandler.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/BaseCommandHandler.java index f67122a..f22ce6a 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/BaseCommandHandler.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/BaseCommandHandler.java @@ -6,5 +6,7 @@ import java.io.IOException; public interface BaseCommandHandler { void handle(JSONObject msg) throws IOException; + + void handle(String msg, Integer to) throws IOException; } diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/CommandDispatcher.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/CommandDispatcher.java index cf2a2a9..959eb5a 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/CommandDispatcher.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/CommandDispatcher.java @@ -3,6 +3,7 @@ package xin.merlin.myplayerbackend.utils.websocket.command; import com.alibaba.fastjson2.JSONObject; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import xin.merlin.myplayerbackend.utils.websocket.OnlineWebSocketSessionManager; import xin.merlin.myplayerbackend.utils.websocket.command.impl.*; import java.io.IOException; @@ -10,6 +11,8 @@ import java.io.IOException; @Component @RequiredArgsConstructor public class CommandDispatcher { + private final OnlineWebSocketSessionManager sessionManager; + private final Ping pingCommand; private final Message messageCommand; private final Typing typingCommand; @@ -31,7 +34,15 @@ public class CommandDispatcher { case "GROUP_MESSAGE" -> groupMessageCommand.handle(msg); default -> { - System.err.println("Unknown command: " + cmd); +// System.err.println("Unknown command: " + cmd); + // TODO: 这里应该使用default的一个类统一封装 + + try { + String to = msg.getString("to"); + sessionManager.sendToUser(Integer.valueOf(to), msg.toJSONString()); + } catch (IOException e) { + throw new RuntimeException(e); + } } } } diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/CommandDispatcherVideo.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/CommandDispatcherVideo.java new file mode 100644 index 0000000..27ed7e1 --- /dev/null +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/CommandDispatcherVideo.java @@ -0,0 +1,34 @@ +package xin.merlin.myplayerbackend.utils.websocket.command; + +import com.alibaba.fastjson2.JSONObject; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import xin.merlin.myplayerbackend.utils.websocket.PlayroomWebSocketSessionManager; +import xin.merlin.myplayerbackend.utils.websocket.command.impl.Ping; + +import java.io.IOException; + +@Component +@RequiredArgsConstructor +public class CommandDispatcherVideo { + + private final Ping pingCommand; + + + public void dispatch(JSONObject msg) throws IOException { + String cmd = msg.getString("cmd"); + Integer to = Integer.valueOf(msg.getString("to")); + String jsonString = msg.toJSONString(); + + switch (cmd){ + case "PING" -> pingCommand.handle(jsonString,to); + default -> { +// System.err.println("Unknown command: " + cmd); + // TODO: 这里应该使用default的一个类统一封装 + + } + } + + + } +} diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/GroupMessage.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/GroupMessage.java index 9f1f0a1..f1e2a4d 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/GroupMessage.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/GroupMessage.java @@ -6,7 +6,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import xin.merlin.myplayerbackend.entity.Groups; import xin.merlin.myplayerbackend.mapper.GroupsMapper; -import xin.merlin.myplayerbackend.utils.websocket.WebSocketSessionManager; +import xin.merlin.myplayerbackend.utils.websocket.OnlineWebSocketSessionManager; import xin.merlin.myplayerbackend.utils.websocket.command.BaseCommandHandler; import java.io.IOException; @@ -18,7 +18,7 @@ public class GroupMessage implements BaseCommandHandler { private final GroupsMapper groupsMapper; - private final WebSocketSessionManager sessionManager; + private final OnlineWebSocketSessionManager sessionManager; @Override public void handle(JSONObject msg) throws IOException { @@ -44,4 +44,9 @@ public class GroupMessage implements BaseCommandHandler { } } + @Override + public void handle(String msg, Integer to) throws IOException { + + } + } diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Heartbeat.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Heartbeat.java index d84ec53..727ce0f 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Heartbeat.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Heartbeat.java @@ -6,6 +6,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import xin.merlin.myplayerbackend.utils.websocket.command.BaseCommandHandler; +import java.io.IOException; import java.time.Duration; @Component @@ -19,4 +20,9 @@ public class Heartbeat implements BaseCommandHandler { String userId = msg.getString("from"); redis.opsForValue().set("online:" + userId, "1", Duration.ofMinutes(5)); } + + @Override + public void handle(String msg, Integer to) throws IOException { + + } } diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Message.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Message.java index ddadaa8..2f58994 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Message.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Message.java @@ -3,7 +3,7 @@ package xin.merlin.myplayerbackend.utils.websocket.command.impl; import com.alibaba.fastjson2.JSONObject; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; -import xin.merlin.myplayerbackend.utils.websocket.WebSocketSessionManager; +import xin.merlin.myplayerbackend.utils.websocket.OnlineWebSocketSessionManager; import xin.merlin.myplayerbackend.utils.websocket.command.BaseCommandHandler; import java.io.IOException; @@ -12,7 +12,7 @@ import java.io.IOException; @RequiredArgsConstructor public class Message implements BaseCommandHandler { - private final WebSocketSessionManager sessionManager; + private final OnlineWebSocketSessionManager sessionManager; @Override public void handle(JSONObject msg) throws IOException { @@ -22,5 +22,10 @@ TODO: 这里需要处理如果目标用户不在线,如何去完成消息的 String to = msg.getString("to"); sessionManager.sendToUser(Integer.valueOf(to), msg.toJSONString()); } + + @Override + public void handle(String msg, Integer to) throws IOException { + + } } diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/PersonalNotify.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/PersonalNotify.java index 3df266f..9f1eb3a 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/PersonalNotify.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/PersonalNotify.java @@ -3,7 +3,7 @@ package xin.merlin.myplayerbackend.utils.websocket.command.impl; import com.alibaba.fastjson2.JSONObject; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; -import xin.merlin.myplayerbackend.utils.websocket.WebSocketSessionManager; +import xin.merlin.myplayerbackend.utils.websocket.OnlineWebSocketSessionManager; import xin.merlin.myplayerbackend.utils.websocket.command.BaseCommandHandler; import java.io.IOException; @@ -12,11 +12,16 @@ import java.io.IOException; @RequiredArgsConstructor public class PersonalNotify implements BaseCommandHandler { - private final WebSocketSessionManager sessionManager; + private final OnlineWebSocketSessionManager sessionManager; @Override public void handle(JSONObject msg) throws IOException { String to = msg.getString("to"); sessionManager.sendToUser(Integer.valueOf(to), msg.toJSONString()); } + + @Override + public void handle(String msg, Integer to) throws IOException { + + } } diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Ping.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Ping.java index 1262e3a..a55152d 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Ping.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Ping.java @@ -3,7 +3,8 @@ package xin.merlin.myplayerbackend.utils.websocket.command.impl; import com.alibaba.fastjson2.JSONObject; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; -import xin.merlin.myplayerbackend.utils.websocket.WebSocketSessionManager; +import xin.merlin.myplayerbackend.utils.websocket.OnlineWebSocketSessionManager; +import xin.merlin.myplayerbackend.utils.websocket.PlayroomWebSocketSessionManager; import xin.merlin.myplayerbackend.utils.websocket.command.BaseCommandHandler; import java.io.IOException; @@ -12,13 +13,21 @@ import java.io.IOException; @RequiredArgsConstructor public class Ping implements BaseCommandHandler { - private final WebSocketSessionManager sessionManager; + private final OnlineWebSocketSessionManager onlineWebSocketSessionManager; + + private final PlayroomWebSocketSessionManager playroomWebSocketSessionManager; @Override public void handle(JSONObject msg) throws IOException { String from = msg.getString("from"); msg.put("cmd", "PONG"); - sessionManager.sendToUser(Integer.valueOf(from), msg.toJSONString()); + onlineWebSocketSessionManager.sendToUser(Integer.valueOf(from), msg.toJSONString()); + } + + @Override + public void handle(String msg, Integer to) throws IOException { + System.out.println(to+":"+msg); + playroomWebSocketSessionManager.sendToUser(to, msg); } } diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/SystemNotify.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/SystemNotify.java index 68e0fc5..69bef3f 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/SystemNotify.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/SystemNotify.java @@ -3,7 +3,7 @@ package xin.merlin.myplayerbackend.utils.websocket.command.impl; import com.alibaba.fastjson2.JSONObject; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; -import xin.merlin.myplayerbackend.utils.websocket.WebSocketSessionManager; +import xin.merlin.myplayerbackend.utils.websocket.OnlineWebSocketSessionManager; import xin.merlin.myplayerbackend.utils.websocket.command.BaseCommandHandler; import java.io.IOException; @@ -12,11 +12,16 @@ import java.io.IOException; @RequiredArgsConstructor public class SystemNotify implements BaseCommandHandler { - private final WebSocketSessionManager sessionManager; + private final OnlineWebSocketSessionManager sessionManager; @Override public void handle(JSONObject msg) throws IOException { sessionManager.broadcast(msg.toJSONString()); } + + @Override + public void handle(String msg, Integer to) throws IOException { + + } } diff --git a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Typing.java b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Typing.java index 7c69c13..a0a994c 100644 --- a/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Typing.java +++ b/src/main/java/xin/merlin/myplayerbackend/utils/websocket/command/impl/Typing.java @@ -3,7 +3,7 @@ package xin.merlin.myplayerbackend.utils.websocket.command.impl; import com.alibaba.fastjson2.JSONObject; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; -import xin.merlin.myplayerbackend.utils.websocket.WebSocketSessionManager; +import xin.merlin.myplayerbackend.utils.websocket.OnlineWebSocketSessionManager; import xin.merlin.myplayerbackend.utils.websocket.command.BaseCommandHandler; import java.io.IOException; @@ -12,11 +12,16 @@ import java.io.IOException; @RequiredArgsConstructor public class Typing implements BaseCommandHandler { - private final WebSocketSessionManager sessionManager; + private final OnlineWebSocketSessionManager sessionManager; @Override public void handle(JSONObject msg) throws IOException { String to = msg.getString("to"); sessionManager.sendToUser(Integer.valueOf(to), msg.toJSONString()); } + + @Override + public void handle(String msg, Integer to) throws IOException { + + } }