|  | @@ -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;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 |