//package com.docus.server.common.netty.server.handler;
//
//import com.docus.core.util.Func;
//import com.docus.core.util.StringUtils;
//import com.docus.core.util.json.JSON;
//import com.docus.server.common.MsgConstants;
//import com.docus.server.common.netty.CommMsg;
//import com.docus.server.common.netty.server.ChannelRepository;
//import io.netty.buffer.ByteBuf;
//import io.netty.channel.ChannelHandler;
//import io.netty.channel.ChannelHandlerContext;
//import io.netty.channel.ChannelInboundHandlerAdapter;
//import lombok.extern.slf4j.Slf4j;
//
//import java.io.Serializable;
//import java.net.InetSocketAddress;
//
///**
// * 客户端和服务端心跳
// */
//@Slf4j
//@ChannelHandler.Sharable
//public class NettyHeartbeatHandler extends ChannelInboundHandlerAdapter {
//
//    @Override
//    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//        ByteBuf buf = (ByteBuf) msg;
//        //创建目标大小的数组
//        byte[] barray = new byte[buf.readableBytes()];
//        //把数据从bytebuf转移到byte[]
//        buf.getBytes(0, barray);
//        //将byte[]转成字符串用于打印
//        String message = new String(barray);
//        //空消息不处理
//        if (!StringUtils.hasText(message)) {
//            return;
//        }
//
//        CommMsg commMsg = JSON.fromJSON(message, CommMsg.class);
//
//        String messageType = commMsg.getMessageType();
//        String messageTime = commMsg.getMessageTime();
//        Serializable messageContent = commMsg.getContent();
//
//        if (messageType.equals(MsgConstants.HEARTBEAT_REQUEST)) {
//
//            log.info("接收到客户端的心跳");
//
//
//            log.info("接受到【采集器-终端】的心跳消息：消息类型={}，消息时间={}，消息内容={}", messageType, messageTime, messageContent);
//
//            InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
//            String clientIp = ipSocket.getAddress().getHostAddress();
//
//            log.info("【采集器-终端IP】:{}，连接上线,IP地址信息:{}", clientIp, clientIp);
//
//            String clientKey = repository.getClientKey(ctx.channel());
//
//            if (Func.isNotBlank(clientKey)) {
//
//                //将ip和channel进行映射
//                repository.put(clientKey, ctx.channel());
//            }
//
//        } else {
//
//            if (ctx.channel().isOpen()) {
//                //触发下一个handler
//                ctx.fireChannelRead(msg);
//            }
//        }
//
//    }
//
//    private ChannelRepository repository;
//
//    public NettyHeartbeatHandler(ChannelRepository repository) {
//        this.repository = repository;
//    }
//
//
//
//    @Override
//    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
//        cause.printStackTrace();
//        String clientId = repository.getClientKey(ctx.channel());
//        log.error("通道发生异常，终端连接：{}", clientId);
//        //移除终端，终端离线
//        if (clientId != null) {
//            repository.remove(clientId);
//        }
//        if (ctx.channel().isActive()) {
//            ctx.close();
//        }
//        super.exceptionCaught(ctx, cause);
//    }
//}
