服务端:

package HeatBeat;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;import io.netty.handler.logging.LoggingHandler;import io.netty.handler.timeout.IdleStateHandler;import java.util.concurrent.TimeUnit;public class MyServer {    public static void main(String[] args) throws InterruptedException {        NioEventLoopGroup bossGroup = new NioEventLoopGroup(1);        NioEventLoopGroup workGroup = new NioEventLoopGroup();        try{            ServerBootstrap serverBootstrap = new ServerBootstrap();            serverBootstrap.group(bossGroup,workGroup)                    .channel(NioServerSocketChannel.class)                    .handler(new LoggingHandler())                    .childHandler(new ChannelInitializer<SocketChannel>() {                        @Override                        protected void initChannel(SocketChannel socketChannel) throws Exception {                            ChannelPipeline pipeline = socketChannel.pipeline();                            pipeline.addLast(new IdleStateHandler(3,5,7, TimeUnit.SECONDS));                            pipeline.addLast(new MyServerHandler());                        }                    });            ChannelFuture channelFuture = serverBootstrap.bind(7000).sync();            channelFuture.channel().closeFuture().sync();        }finally{            bossGroup.shutdownGracefully();            workGroup.shutdownGracefully();        }    }} 

服务端handler:

package HeatBeat;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;import io.netty.handler.timeout.IdleStateEvent;public class MyServerHandler 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 ALL_IDLE:                    eventType = "读写闲暇";                    break;                case READER_IDLE:                    eventType = "读闲暇";                    break;                case WRITER_IDLE:                    eventType = "写闲暇";                    break;            }            System.out.println(ctx.channel().remoteAddress() + "--" + eventType);        }