From 9c19c883f2088324965c6d50e5514691db5508fe Mon Sep 17 00:00:00 2001
From: zhuml4 <zhuml4@xiaopeng.com>
Date: 星期六, 07 三月 2026 21:00:56 +0800
Subject: [PATCH] fix:websocket共用http端口

---
 xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketTextFrameHandler.java |  386 +++++++++++++++++++++++++++---------------------------
 1 files changed, 193 insertions(+), 193 deletions(-)

diff --git a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketTextFrameHandler.java b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketTextFrameHandler.java
index ebd7ee5..4a9ef48 100644
--- a/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketTextFrameHandler.java
+++ b/xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketTextFrameHandler.java
@@ -1,195 +1,195 @@
 package com.xiaopeng.pushMessage.webSocket.handler;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.xiaopeng.pushMessage.webSocket.service.WebSocketUserConnectionManager;
-import io.netty.channel.ChannelHandler;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-import java.time.LocalDateTime;
-import java.util.Objects;
-import java.util.UUID;
-
-/**
- * TextWebSocketFrame 表示一个文本桢
- * 使用@Sharable注解使其可以被多个连接共享
- * 支持基于AppUser的连接管理
- */
-@Component
-@Slf4j
-@ChannelHandler.Sharable
-public class WebSocketTextFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
-
-
-    @Autowired
-    private WebSocketUserConnectionManager userConnectionManager;
-    
-    @Autowired
-    private WebSocketAuthHandler authHandler;
-
-    @Override
-    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
-        String message = msg.text();
-        log.info("[服务器] : 收到消息 -> {}", message);
-        
-        try {
-            // 尝试解析消息,检查是否包含用户认证信息
-            JSONObject messageObj = JSON.parseObject(message);
-            String messageType = messageObj.getString("type");
-            
-            if ("auth".equals(messageType)) {
-                // 处理用户认证消息
-                handleUserAuth(ctx, messageObj);
-            } else if ("ping".equals(messageType)) {
-                // 处理心跳消息
-                handlePing(ctx, messageObj);
-            } else {
-                // 处理普通业务消息
-                handleBusinessMessage(ctx, messageObj);
-            }
-        } catch (Exception e) {
-            // 如果不是JSON格式,按普通文本处理
-            log.debug("消息不是JSON格式,按普通文本处理: {}", message);
-            ctx.channel().writeAndFlush(new TextWebSocketFrame("服务器时间: " + LocalDateTime.now() + "->" + message));
-        }
-    }
-    
-    /**
-     * 处理用户认证消息
-     */
-    private void handleUserAuth(ChannelHandlerContext ctx, JSONObject messageObj) {
-        try {
-            // 提取认证信息
-            WebSocketAuthHandler.UserAuthInfo authInfo = authHandler.extractAuthInfo(messageObj);
-            String appUserId = authInfo.getAppUserId();
-            String token = authInfo.getToken();
-            
-            if (!StringUtils.hasText(appUserId)) {
-                sendAuthFailureResponse(ctx, "用户ID不能为空");
-                return;
-            }
-            
-            // 进行用户认证
-            WebSocketAuthHandler.AuthResult authResult = authHandler.authenticateUser(appUserId, token);
-            if (authResult.isSuccess()) {
-                // 认证成功,将连接与用户关联
-                userConnectionManager.addUserConnection(appUserId, ctx.channel());
-                
-                // 发送认证成功响应
-                JSONObject response = new JSONObject();
-                response.put("type", "auth_success");
-                response.put("appUserId", appUserId);
-                // TODO
-                String uuid = UUID.randomUUID().toString();
-                response.put("nickName", uuid);
-//                response.put("nickName", authResult.getAppUser().getNickName());
-                response.put("message", "认证成功");
-                response.put("timestamp", LocalDateTime.now().toString());
-                
-                ctx.channel().writeAndFlush(new TextWebSocketFrame(response.toJSONString()));
-                log.info("用户 {} ({}) 认证成功,ChannelId: {}", 
-                        appUserId, uuid, ctx.channel().id().asLongText());
-            } else {
-                // 认证失败
-                sendAuthFailureResponse(ctx, authResult.getMessage());
-                log.warn("用户 {} 认证失败: {}, ChannelId: {}", 
-                        appUserId, authResult.getMessage(), ctx.channel().id().asLongText());
-            }
-        } catch (Exception e) {
-            log.error("处理用户认证时发生错误", e);
-            sendAuthFailureResponse(ctx, "认证过程中发生错误: " + e.getMessage());
-        }
-    }
-    
-    /**
-     * 发送认证失败响应
-     */
-    private void sendAuthFailureResponse(ChannelHandlerContext ctx, String message) {
-        JSONObject response = new JSONObject();
-        response.put("type", "auth_failed");
-        response.put("message", message);
-        response.put("timestamp", LocalDateTime.now().toString());
-        
-        ctx.channel().writeAndFlush(new TextWebSocketFrame(response.toJSONString()));
-    }
-    
-    /**
-     * 处理心跳消息
-     */
-    private void handlePing(ChannelHandlerContext ctx, JSONObject messageObj) {
-        String appUserId = userConnectionManager.getUserIdByChannelId(ctx.channel().id().asLongText());
-        
-        JSONObject response = new JSONObject();
-        response.put("type", "pong");
-        log.info("心跳用户id:{}",appUserId);
-        response.put("appUserId", appUserId);
-        response.put("timestamp", LocalDateTime.now().toString());
-        
-        ctx.channel().writeAndFlush(new TextWebSocketFrame(response.toJSONString()));
-    }
-    
-    /**
-     * 处理业务消息
-     */
-    private void handleBusinessMessage(ChannelHandlerContext ctx, JSONObject messageObj) {
-        String appUserId = userConnectionManager.getUserIdByChannelId(ctx.channel().id().asLongText());
-        
-        if (appUserId != null) {
-            log.info("收到用户 {} 的业务消息: {}", appUserId, messageObj.toJSONString());
-            
-            // 回复消息
-            JSONObject response = new JSONObject();
-            response.put("type", "message_response");
-            response.put("appUserId", appUserId);
-            response.put("originalMessage", messageObj);
-            response.put("serverTime", LocalDateTime.now().toString());
-            
-            ctx.channel().writeAndFlush(new TextWebSocketFrame(response.toJSONString()));
-        } else {
-            log.warn("收到未认证连接的业务消息: {}", messageObj.toJSONString());
-            
-            // 要求先认证
-            JSONObject response = new JSONObject();
-            response.put("type", "auth_required");
-            response.put("message", "请先进行用户认证");
-            response.put("timestamp", LocalDateTime.now().toString());
-            
-            ctx.channel().writeAndFlush(new TextWebSocketFrame(response.toJSONString()));
-        }
-    }
-
-    @Override
-    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
-        // id 表示唯一的值 LongText是唯一的
-        log.info("handlerAdded 被调用: {}", ctx.channel().id().asLongText());
-        // shortText 可能会重复
-        log.info("handlerAdded 被调用: {}", ctx.channel().id().asShortText());
-
-        // 注意:用户连接管理在认证时添加,这里不添加
-    }
-
-    @Override
-    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
-        // id 表示唯一的值 LongText是唯一的
-        log.info("handlerRemoved 被调用: {}", ctx.channel().id().asLongText());
-        // shortText 可能会重复
-        log.info("handlerRemoved 被调用: {}", ctx.channel().id().asShortText());
-        
-        // 从用户连接管理器中移除连接
-        if (userConnectionManager != null) {
-            userConnectionManager.removeUserConnection(ctx.channel());
-        }
-    }
-
-    @Override
-    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
-        log.error("WebSocket连接异常: {}", cause.getMessage(), cause);
-        ctx.channel().close();
-    }
-}
\ No newline at end of file
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONObject;
+//import com.xiaopeng.pushMessage.webSocket.service.WebSocketUserConnectionManager;
+//import io.netty.channel.ChannelHandler;
+//import io.netty.channel.ChannelHandlerContext;
+//import io.netty.channel.SimpleChannelInboundHandler;
+//import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Component;
+//import org.springframework.util.StringUtils;
+//
+//import java.time.LocalDateTime;
+//import java.util.Objects;
+//import java.util.UUID;
+//
+///**
+// * TextWebSocketFrame 表示一个文本桢
+// * 使用@Sharable注解使其可以被多个连接共享
+// * 支持基于AppUser的连接管理
+// */
+//@Component
+//@Slf4j
+//@ChannelHandler.Sharable
+//public class WebSocketTextFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
+//
+//
+//    @Autowired
+//    private WebSocketUserConnectionManager userConnectionManager;
+//
+//    @Autowired
+//    private WebSocketAuthHandler authHandler;
+//
+//    @Override
+//    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
+//        String message = msg.text();
+//        log.info("[服务器] : 收到消息 -> {}", message);
+//
+//        try {
+//            // 尝试解析消息,检查是否包含用户认证信息
+//            JSONObject messageObj = JSON.parseObject(message);
+//            String messageType = messageObj.getString("type");
+//
+//            if ("auth".equals(messageType)) {
+//                // 处理用户认证消息
+//                handleUserAuth(ctx, messageObj);
+//            } else if ("ping".equals(messageType)) {
+//                // 处理心跳消息
+//                handlePing(ctx, messageObj);
+//            } else {
+//                // 处理普通业务消息
+//                handleBusinessMessage(ctx, messageObj);
+//            }
+//        } catch (Exception e) {
+//            // 如果不是JSON格式,按普通文本处理
+//            log.debug("消息不是JSON格式,按普通文本处理: {}", message);
+//            ctx.channel().writeAndFlush(new TextWebSocketFrame("服务器时间: " + LocalDateTime.now() + "->" + message));
+//        }
+//    }
+//
+//    /**
+//     * 处理用户认证消息
+//     */
+//    private void handleUserAuth(ChannelHandlerContext ctx, JSONObject messageObj) {
+//        try {
+//            // 提取认证信息
+//            WebSocketAuthHandler.UserAuthInfo authInfo = authHandler.extractAuthInfo(messageObj);
+//            String appUserId = authInfo.getAppUserId();
+//            String token = authInfo.getToken();
+//
+//            if (!StringUtils.hasText(appUserId)) {
+//                sendAuthFailureResponse(ctx, "用户ID不能为空");
+//                return;
+//            }
+//
+//            // 进行用户认证
+//            WebSocketAuthHandler.AuthResult authResult = authHandler.authenticateUser(appUserId, token);
+//            if (authResult.isSuccess()) {
+//                // 认证成功,将连接与用户关联
+//                userConnectionManager.addUserConnection(appUserId, ctx.channel());
+//
+//                // 发送认证成功响应
+//                JSONObject response = new JSONObject();
+//                response.put("type", "auth_success");
+//                response.put("appUserId", appUserId);
+//                // TODO
+//                String uuid = UUID.randomUUID().toString();
+//                response.put("nickName", uuid);
+////                response.put("nickName", authResult.getAppUser().getNickName());
+//                response.put("message", "认证成功");
+//                response.put("timestamp", LocalDateTime.now().toString());
+//
+//                ctx.channel().writeAndFlush(new TextWebSocketFrame(response.toJSONString()));
+//                log.info("用户 {} ({}) 认证成功,ChannelId: {}",
+//                        appUserId, uuid, ctx.channel().id().asLongText());
+//            } else {
+//                // 认证失败
+//                sendAuthFailureResponse(ctx, authResult.getMessage());
+//                log.warn("用户 {} 认证失败: {}, ChannelId: {}",
+//                        appUserId, authResult.getMessage(), ctx.channel().id().asLongText());
+//            }
+//        } catch (Exception e) {
+//            log.error("处理用户认证时发生错误", e);
+//            sendAuthFailureResponse(ctx, "认证过程中发生错误: " + e.getMessage());
+//        }
+//    }
+//
+//    /**
+//     * 发送认证失败响应
+//     */
+//    private void sendAuthFailureResponse(ChannelHandlerContext ctx, String message) {
+//        JSONObject response = new JSONObject();
+//        response.put("type", "auth_failed");
+//        response.put("message", message);
+//        response.put("timestamp", LocalDateTime.now().toString());
+//
+//        ctx.channel().writeAndFlush(new TextWebSocketFrame(response.toJSONString()));
+//    }
+//
+//    /**
+//     * 处理心跳消息
+//     */
+//    private void handlePing(ChannelHandlerContext ctx, JSONObject messageObj) {
+//        String appUserId = userConnectionManager.getUserIdByChannelId(ctx.channel().id().asLongText());
+//
+//        JSONObject response = new JSONObject();
+//        response.put("type", "pong");
+//        log.info("心跳用户id:{}",appUserId);
+//        response.put("appUserId", appUserId);
+//        response.put("timestamp", LocalDateTime.now().toString());
+//
+//        ctx.channel().writeAndFlush(new TextWebSocketFrame(response.toJSONString()));
+//    }
+//
+//    /**
+//     * 处理业务消息
+//     */
+//    private void handleBusinessMessage(ChannelHandlerContext ctx, JSONObject messageObj) {
+//        String appUserId = userConnectionManager.getUserIdByChannelId(ctx.channel().id().asLongText());
+//
+//        if (appUserId != null) {
+//            log.info("收到用户 {} 的业务消息: {}", appUserId, messageObj.toJSONString());
+//
+//            // 回复消息
+//            JSONObject response = new JSONObject();
+//            response.put("type", "message_response");
+//            response.put("appUserId", appUserId);
+//            response.put("originalMessage", messageObj);
+//            response.put("serverTime", LocalDateTime.now().toString());
+//
+//            ctx.channel().writeAndFlush(new TextWebSocketFrame(response.toJSONString()));
+//        } else {
+//            log.warn("收到未认证连接的业务消息: {}", messageObj.toJSONString());
+//
+//            // 要求先认证
+//            JSONObject response = new JSONObject();
+//            response.put("type", "auth_required");
+//            response.put("message", "请先进行用户认证");
+//            response.put("timestamp", LocalDateTime.now().toString());
+//
+//            ctx.channel().writeAndFlush(new TextWebSocketFrame(response.toJSONString()));
+//        }
+//    }
+//
+//    @Override
+//    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
+//        // id 表示唯一的值 LongText是唯一的
+//        log.info("handlerAdded 被调用: {}", ctx.channel().id().asLongText());
+//        // shortText 可能会重复
+//        log.info("handlerAdded 被调用: {}", ctx.channel().id().asShortText());
+//
+//        // 注意:用户连接管理在认证时添加,这里不添加
+//    }
+//
+//    @Override
+//    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
+//        // id 表示唯一的值 LongText是唯一的
+//        log.info("handlerRemoved 被调用: {}", ctx.channel().id().asLongText());
+//        // shortText 可能会重复
+//        log.info("handlerRemoved 被调用: {}", ctx.channel().id().asShortText());
+//
+//        // 从用户连接管理器中移除连接
+//        if (userConnectionManager != null) {
+//            userConnectionManager.removeUserConnection(ctx.channel());
+//        }
+//    }
+//
+//    @Override
+//    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+//        log.error("WebSocket连接异常: {}", cause.getMessage(), cause);
+//        ctx.channel().close();
+//    }
+//}
\ No newline at end of file

--
Gitblit v1.7.1