第三个Netty程序:心跳检测

第三个Netty程序:心跳检测

目的及介绍

  • 模仿一个服务器端检测客服端心跳的机制
  • 场景:在长链接情况下,服务器端需要通过心跳机制来确认客服端存活情况。

项目源码

  • HighAvailability_HighConcurrency_HighPerformance

搭建、设计思路

  • 服务器端
    • 跟之前的设计一样,由server、serverinitializer、serverhandler组成
    • 看代码会发现server多了一个handler(new LoggingHandler(LogLevel.INFO)),用于拦截日志多
    • 多了一个IdleStateHandler,它的参数是(读,写,all,时间单位)。
    • 自己写的ServerHandle03,主要是判断event.state()的状态,然后简单打印输出。
  • 客户端
    • 代码同02
  • 测试设计
    • 通过心跳检测读操作:设置读写检测时间为(5,7,10),启动服务器端和客服端,客户短在5s内没有输入,服务器端显示读超时。
    • 通过心跳检测写操作:设置读写检测时间为(5,7,10),启动服务器端和客服端,客户短在5s内连续输入,服务器端没有输出,于是服务器端显示写超时。
    • 通过心跳检测读写操作:设置读写检测时间为(10,7,5),启动服务器端和客服端,客户短在5s内没有输入,服务器端显示读写超时,即只要读写有一个超时,即报错。

具体步骤

  • 服务器端的Initializer
public class ServerInitializer03 extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        pipeline.addLast(new IdleStateHandler(5, 7, 10, TimeUnit.SECONDS));
        pipeline.addLast(new ServerHandle03());
    }
}
  • 服务器端的handler
public class ServerHandle03 extends ChannelInboundHandlerAdapter {

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent) evt;
            String eventType = null;
            switch (event.state()) {
                case READER_IDLE:
                    eventType = "read idel";
                    break;
                case WRITER_IDLE:
                    eventType = "write idel";
                    break;
                case ALL_IDLE:
                    eventType = "read and write idel";
                    break;
            }
            System.out.println(ctx.channel().remoteAddress() + "超时事件" + eventType);
            ctx.channel().close();
        }
    }
}

排坑细节

  • 端口号是否占用
  • 代码要区分ChannelHandlerContext ctx, Object evt的使用区别。

你可能感兴趣的:(高并发,高可用,高性能专题)