netty(七)--开发netty心跳检测机制

需求:

在这里插入图片描述
所用接口说明:

在这里插入图片描述

当IdleStateEvent产生后,会传递给管道的下一个handler,通过调用下一个handler的userEventTiggered,在该方法中区处理IdleStateEvent(读空闲,写空闲,读写空闲)
服务端代码:

package com.example.demo.heartBeat;

import com.example.demo.chat.chatServerHandler;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.timeout.IdleStateHandler;

import java.util.concurrent.TimeUnit;

public class server {
   private int port;
   public server(int port){
       this.port=port;
   }

    public void run () throws Exception {
        EventLoopGroup workGroup= new NioEventLoopGroup();
        EventLoopGroup boosGroup=new NioEventLoopGroup();
        try{
            ServerBootstrap bootstrap=new ServerBootstrap();
            bootstrap.group(boosGroup,workGroup)
                    .channel(NioServerSocketChannel.class)//使用NioServerSocketChannel,作为服务器的通道实现
                    .option(ChannelOption.SO_BACKLOG,128)//设置线程队列的连接个数
                    .childOption(ChannelOption.SO_KEEPALIVE,true)//设置保持活动连接状态
                    .childHandler(new ChannelInitializer<SocketChannel>() {

                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            ChannelPipeline pipeline=socketChannel.pipeline();
                            //加入一个netty提供的IdleStateHandler
                            pipeline.addLast(new IdleStateHandler(3,5,7, TimeUnit.SECONDS));

                            //自定义处理
                            pipeline.addLast("myHandler",new serverHandler());
                        }
                    });
            ChannelFuture future=bootstrap.bind(this.port).sync();
            future.channel().closeFuture().sync();
        }finally {
            workGroup.shutdownGracefully();;
            boosGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws Exception {
        new server(6668).run();
    }
}

handler:

package com.example.demo.heartBeat;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.timeout.IdleStateEvent;

public class serverHandler extends SimpleChannelInboundHandler {

    @Override
    protected void messageReceived(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {

    }

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if(evt instanceof IdleStateEvent){
            //将evt向下转型IdleStateEvent
            IdleStateEvent event=(IdleStateEvent)evt;
            String eventType=null;
            switch (event.state()){
                case READER_IDLE:
                    eventType="读空闲";break;
                case WRITER_IDLE:
                    eventType="写空闲";break;
                case ALL_IDLE:
                    eventType="读写空闲";break;
            }
            System.out.println(ctx.channel().remoteAddress()+"超时时间--"+eventType);
        }
    }
}

再用前面写过的clien进行连接,效果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值