|
|
@@ -0,0 +1,152 @@
|
|
|
+package com.xunmei.mediator.websocket.handler;
|
|
|
+
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.xunmei.common.core.utils.StringUtils;
|
|
|
+import com.xunmei.common.redis.utils.RedisUtils;
|
|
|
+import com.xunmei.mediator.websocket.dto.WebsocketResult;
|
|
|
+import com.xunmei.mediator.websocket.holder.WebSocketSessionHolder;
|
|
|
+import com.xunmei.mediator.websocket.utils.WebSocketUtils;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.web.socket.*;
|
|
|
+import org.springframework.web.socket.handler.AbstractWebSocketHandler;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.time.Duration;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author gaoxiong
|
|
|
+ * @Title: 实现类
|
|
|
+ * @Package
|
|
|
+ * @Description:
|
|
|
+ * @date 2024/7/517:18
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+public class SocWebSocketHandler extends AbstractWebSocketHandler {
|
|
|
+ /**
|
|
|
+ * 连接成功后
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void afterConnectionEstablished(WebSocketSession session) throws IOException {
|
|
|
+
|
|
|
+ String registerCode = (String) session.getAttributes().get("registerCode");
|
|
|
+ if (registerCode != null) {
|
|
|
+ Map<String,Object> map = new HashMap<>();
|
|
|
+ map.put("token","kkjkkjjiikkjkjkj");
|
|
|
+ map.put("statusCode",200);
|
|
|
+ WebsocketResult register = createWebsocketResult(null, "register" , map);
|
|
|
+ WebSocketUtils.sendMessage(session, JSON.toJSONString(register));
|
|
|
+ log.info("[建立注册连接] sessionId: {},registerCode:{}", session.getId(), registerCode);
|
|
|
+ session.close();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ String token = (String) session.getAttributes().get("token");
|
|
|
+ if(StringUtils.isNotEmpty(token)){
|
|
|
+ WebSocketSessionHolder.addSession(token, session);
|
|
|
+ Map<String,Object> map = new HashMap<>();
|
|
|
+ map.put("statusCode",200);
|
|
|
+ WebsocketResult result = createWebsocketResult(null, "login" , map);
|
|
|
+ WebSocketUtils.sendMessage(session, JSON.toJSONString(result));
|
|
|
+ log.info("[建立连接] sessionId: {},token:{}", session.getId(), token);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ session.close();
|
|
|
+ }
|
|
|
+
|
|
|
+ private WebsocketResult createWebsocketResult(String id,String topic,Object object){
|
|
|
+ WebsocketResult result = new WebsocketResult();
|
|
|
+ result.setId(id);
|
|
|
+ result.setTopic(topic);
|
|
|
+ //当前时间转换为 格式:2024-07-02T14:17:32
|
|
|
+ result.setTimestamp(DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
|
|
|
+ result.setPayload(object);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理接收到的文本消息
|
|
|
+ *
|
|
|
+ * @param session WebSocket会话
|
|
|
+ * @param message 接收到的文本消息
|
|
|
+ * @throws Exception 处理消息过程中可能抛出的异常
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
|
|
|
+ // 从WebSocket会话中获取登录用户信息
|
|
|
+ WebSocketSessionHolder.updateToken(session);
|
|
|
+ log.info("接收到消息:{}",message.getPayload());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理接收到的二进制消息
|
|
|
+ *
|
|
|
+ * @param session WebSocket会话
|
|
|
+ * @param message 接收到的二进制消息
|
|
|
+ * @throws Exception 处理消息过程中可能抛出的异常
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
|
|
|
+ WebSocketSessionHolder.updateToken(session);
|
|
|
+
|
|
|
+ super.handleBinaryMessage(session, message);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理接收到的Pong消息(心跳监测)
|
|
|
+ *
|
|
|
+ * @param session WebSocket会话
|
|
|
+ * @param message 接收到的Pong消息
|
|
|
+ * @throws Exception 处理消息过程中可能抛出的异常
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
|
|
|
+ WebSocketSessionHolder.updateToken(session);
|
|
|
+
|
|
|
+ WebSocketUtils.sendPongMessage(session);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理WebSocket传输错误
|
|
|
+ *
|
|
|
+ * @param session WebSocket会话
|
|
|
+ * @param exception 发生的异常
|
|
|
+ * @throws Exception 处理过程中可能抛出的异常
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
|
|
|
+ WebSocketSessionHolder.updateToken(session);
|
|
|
+
|
|
|
+ log.error("[传输错误] sessionId: {} , exception:{}", session.getId(), exception.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 在WebSocket连接关闭后执行清理操作
|
|
|
+ *
|
|
|
+ * @param session WebSocket会话
|
|
|
+ * @param status 关闭状态信息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
|
|
|
+ String token = (String) session.getAttributes().get("token");
|
|
|
+ WebSocketSessionHolder.removeSession(token);
|
|
|
+ log.info("[断开连接] sessionId: {},token:{}",session.getId(),token);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指示处理程序是否支持接收部分消息
|
|
|
+ *
|
|
|
+ * @return 如果支持接收部分消息,则返回true;否则返回false
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public boolean supportsPartialMessages() {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|