Helius
2021-05-26 5575818556096be1dadaf5ff356b5db4c832aaa2
src/main/java/com/xcong/excoin/netty/handler/WebSocketServerHandler.java
@@ -38,14 +38,14 @@
@ChannelHandler.Sharable
public class WebSocketServerHandler extends ChannelInboundHandlerAdapter {
    private final ConcurrentMap<String, Integer> pingTimes = new ConcurrentHashMap<>();
//    private final ConcurrentMap<String, Integer> pingTimes = new ConcurrentHashMap<>();
    private static final int MAX_UN_REC_PING_TIMES = 3;
    private WebSocketServerHandshaker handshaker;
    @Resource(name = "msgDispatch")
    private MsgDispatch msgDispatch;
//    @Resource(name = "msgDispatch")
//    private MsgDispatch msgDispatch;
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
@@ -76,7 +76,7 @@
                if (content.contains(Contans.HEART_BEAT)) {
                    resetTimes(ctx.channel());
                } else {
                    this.msgDispatch.webSocketDispatch(ctx, content);
//                    this.msgDispatch.webSocketDispatch(ctx, content);
                }
            } catch (ClassCastException e) {
                content = ((CloseWebSocketFrame) frame).reasonText();
@@ -88,40 +88,40 @@
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        log.info("[触发器触发]");
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent) evt;
            if (event.state() == IdleState.READER_IDLE) {
            } else if (event.state() == IdleState.WRITER_IDLE) {
                /*写超时*/
                ctx.channel().writeAndFlush(NettyTools.webSocketBytes(Contans.HEART_BEAT));
                Integer times = pingTimes.get(ctx.channel().id().asShortText());
                if (times == null) {
                    times = 0;
                }
                /*读超时*/
                log.info("===服务端===({}写超时, {})", ctx.channel().id().asShortText(), times);
                // 失败计数器次数大于等于3次的时候,关闭链接,等待client重连
                if (times >= MAX_UN_REC_PING_TIMES) {
                    log.info("===服务端===(写超时,关闭chanel)");
                    // 连续超过N次未收到client的ping消息,那么关闭该通道,等待client重连
                    ctx.channel().close();
                } else {
                    // 失败计数器加1
                    times++;
                    pingTimes.remove(ctx.channel().id().asShortText());
                    pingTimes.put(ctx.channel().id().asShortText(), times);
                }
            } else if (event.state() == IdleState.ALL_IDLE) {
                /*总超时*/
                System.out.println("===服务端===(ALL_IDLE 总超时)");
            }
        }
//        if (evt instanceof IdleStateEvent) {
//            IdleStateEvent event = (IdleStateEvent) evt;
//            if (event.state() == IdleState.READER_IDLE) {
//
//            } else if (event.state() == IdleState.WRITER_IDLE) {
//                /*写超时*/
//                ctx.channel().writeAndFlush(NettyTools.webSocketBytes(Contans.HEART_BEAT));
//                Integer times = pingTimes.get(ctx.channel().id().asShortText());
//                if (times == null) {
//                    times = 0;
//                }
//                /*读超时*/
//                log.info("===服务端===({}写超时, {})", ctx.channel().id().asShortText(), times);
//                // 失败计数器次数大于等于3次的时候,关闭链接,等待client重连
//                if (times >= MAX_UN_REC_PING_TIMES) {
//                    log.info("===服务端===(写超时,关闭chanel)");
//                    // 连续超过N次未收到client的ping消息,那么关闭该通道,等待client重连
//                    ctx.channel().close();
//                } else {
//                    // 失败计数器加1
//                    times++;
//                    pingTimes.remove(ctx.channel().id().asShortText());
//                    pingTimes.put(ctx.channel().id().asShortText(), times);
//                }
//            } else if (event.state() == IdleState.ALL_IDLE) {
//                /*总超时*/
//                System.out.println("===服务端===(ALL_IDLE 总超时)");
//            }
//        }
    }
    private void resetTimes(Channel channel) {
        pingTimes.remove(channel.id().asShortText());
        pingTimes.put(channel.id().asShortText(), 0);
//        pingTimes.remove(channel.id().asShortText());
//        pingTimes.put(channel.id().asShortText(), 0);
    }
    @Override
@@ -132,6 +132,7 @@
    private void handlerWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {
        System.out.println(111111111);
        // 判断是否关闭链路的指令
        if (frame instanceof CloseWebSocketFrame) {
            handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame.retain());