从目前来看,channelpipeline和channelhandler是一起来理解的。对我来说,channelpipeline就类似于一个容器,这个容器里存放的就是channelhandler。
那首先来讲下channelhandler吧。它包含两个子接口:channelinboundhandler和channeloutboundhandler,分别处理进站和出站的事务。
而channelinboundhandler一般又有channelinboundhandleradapter和simplerchannelinboundhandler,那这个是什么区别呢?
一般用netty来发送和接收数据都会继承SimpleChannelInboundHandler和ChannelInboundHandlerAdapter这两个抽象类,那么这两个到底有什么区别呢?
其实用这两个抽象类是有讲究的,在客户端的业务Handler继承的是SimpleChannelInboundHandler,而在服务器端继承的是ChannelInboundHandlerAdapter。
最主要的区别就是SimpleChannelInboundHandler在接收到数据后会自动release掉数据占用的Bytebuffer资源(自动调用Bytebuffer.release())。而为何服务器端不能用呢,因为我们想让服务器把客户端请求的数据发送回去,而服务器端有可能在channelRead方法返回前还没有写完数据,因此不能让它自动release。(引用https://www.cnblogs.com/Anders888/p/5769016.html)
从这里理解就是,服务器端使用ChannelInboundHandlerAdapter。
那么问题整理如下:
1、在这个channelpipeline中,是如何执行channelhandler的?
2、对于服务器端来说,是先处理进站还是处理出站?
20200326
关于channelpipeline里面的channelhandler,有新的理解,整理如下:
1、channelpipeline中可以 注册多个channelhandler(这些handler必须继承netty的ChannelInboundHandler和ChannelOutboundHandler么);
2、ChannelInboundHandler之间的传递,通过调用 ctx.fireChannelRead(msg) 实现;调用ctx.write(msg) 将传递到ChannelOutboundHandler;
3、ChannelOutboundHandler 在注册的时候需要放在最后一个ChannelInboundHandler之前,否则将无法传递到ChannelOutboundHandler。
4、outBound和Inbound谁先执行,针对客户端和服务端而言,客户端是发起请求再接受数据,先outbound再inbound,服务端则相反。
4、关于addlast和addfirst