liusuyi
2026-04-22 04a270ff2b5919127524913ffc45c59c6c6d9201
ard-work/src/main/java/com/ard/work/component/netty/handler/ClientHandler.java
@@ -58,20 +58,26 @@
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent) evt;
            long timestamp = System.currentTimeMillis();
            switch (event.state()) {
                case READER_IDLE:
                    log.warn("读空闲超时 - 可能服务器未响应");
                    //log.warn("读空闲超时 - 可能服务器未响应");
                    break;
                case WRITER_IDLE:
                    // 写空闲时主动发心跳
                    HeartbeatCmd heartbeat = new HeartbeatCmd(timestamp);
                    ctx.writeAndFlush(heartbeat);
                    log.debug("写空闲 -> 发送心跳包 时间戳={}", timestamp);
                    try {
                        HeartbeatCmd heartbeat = new HeartbeatCmd(System.currentTimeMillis());
                        ctx.writeAndFlush(heartbeat).addListener(future -> {
                            if (!future.isSuccess()) {
                                log.error("写心跳失败,网络断开,关闭连接");
                                ctx.close();
                            }
                        });
                    } catch (Exception e) {
                        log.error("发送心跳异常", e);
                        ctx.close();
                    }
                    break;
                case ALL_IDLE:
                    log.info("读写都空闲 - 可考虑关闭连接或重连");
                    log.warn("读写都空闲 - 可考虑关闭连接或重连");
                    break;
            }
        } else {
@@ -86,7 +92,7 @@
        InetSocketAddress remoteAddress = (InetSocketAddress) channel.remoteAddress();
        String host = remoteAddress.getHostString();
        int port = remoteAddress.getPort();
        log.error("与六合服务{}:{}连接断开!", host, port);
        log.error("与边缘服务器服务{}:{}连接断开!", host, port);
        TyTcpServerCache.putTcpServerCache(serverId, false);
        super.channelInactive(ctx);
    }