Netty之channelhandler和channelpipeline的几点理解

从目前来看,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

发布了125 篇原创文章 · 获赞 9 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/jiezhang656/article/details/105031957
今日推荐