Netty快速入门

示例:

EventLoopGroup bossGroup = new NioEventLoopGroup()
EventLoopGroup workerGroup = new NioEventLoopGroup()
ServerBootstrap bootstrap = new ServerBootstrap()
//配置启动参数
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer() {
    @Override
    public void initChannel(SocketChannel ch) throws Exception {
        ch.pipeline().addLast(new DiscardServerHandler())
    }
})
//调用sync同步方法阻塞直到绑定成功
ChannelFuture f = b.bind().sync()
f.channel().closeFuture().sync()

主要概念:

Bootstrap、EventLoopGroup、Channel、ChannelPipeline、Encoder、Decoder、ChannelHandler、ChannelHandlerContext、ChannelFuture等。

流程梳理:

  • Bootstrap与ServerBootStrap分别是客户端和服务端的启动类,可以配置线程组、channel类和handler类等,ServerBootStrap比Bootstrap多一个childHandler()方法,handler()在初始化时就会执行,而childHandler()会在客户端成功connect后才执行。

  • bootstrap第一个handler类一般都是ChannelInitializer类的子类,其中initChannel(SocketChannel ch)方法可以添加不同的handler,通过ch可以获取Pipeline,Pipeline可以理解为handler容器,一个Channel包含一个Pipeline,如:ch.pipeline().addLast(new DiscardServerHandler())。

  • 自定义的handler主要继承ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter,ChannelHandlerContext可以在多个ChannelHandler中传递数据。

  • 编码器encoder和decoder也是两个adapter的子类,io.netty.handler.codec包下是内置的各种解编码器;编码器一般用List存储半包数据,业务处理一般在解编码操作后进行。

  • 粘包拆包有四种解决方式,LineBasedFrameDecoder换行符解码器、FixedLengthFrameDecoder固定长度解码器、DelimiterBasedFrameDecoder自定义的分隔符解码器、LengthFieldBasedFrameDecoder 指定长度解码器(典型如:TLV 类型-长度-值)

  • ChannelFuture和ChannelFutureListener

channelFuture.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(final ChannelFuture channelFuture) throws Exception {
        //do something
    }
});

你可能感兴趣的:(Netty快速入门)