示例:
EventLoopGroup bossGroup = new NioEventLoopGroup()
EventLoopGroup workerGroup = new NioEventLoopGroup()
ServerBootstrap bootstrap = new ServerBootstrap()
//配置启动参数
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@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
}
});