Netty入站出站事件
入站事件:
通常指I/O线程生成入站数据。(通俗理解:从socket底层往上冒的事件都是入站)比如EventLoop收到selector的OP_READ事件,入站处理器调用socketChannel.read(ByteBuffer)接收到数据后,这将通道ChannelPipeline中包含的下一个channelRead方法被调用。
出站事件:
经常是指I/O线程执行实际的输出操作。(通俗理解:主动往socket底层操作的事件都是出站)比如bind方法的用意是请求server socket绑定的SocketAddress,这将导致通道的ChannelPipline包含下一个出站处理器中bind方法被调用。
Netty通过责任链实现出入站事件处理
我们在使用责任链的时候更多的是
netty的责任链,与我们我们经常使用到责任链相比多了ChannelPipeline来维护这个责任链。
ChannelPipeline链中存储的也并不是直接的处理的处理器,而是包裹handler处理器的DefaultChannelHandlerContext。
对于我这边理解之所以引入ChannelPipeline这个上下文,是因为在在使用handler处理器的时候,需要有添加和删除handler的操作,用ChannelPipeline这个这个责任链能够更好管理hanler处理。
DefaultChannelHandlerContext这种包装的代替handler的原因,是在handler处理的时候,可能会经常遇到另外线程池的处理,而更好关注业务本身用DefaultChannelHandlerContext代替了handler.
那我之所以需要分入站与出站,这个是因为我们在添加责任链的时候,入站事件只会处理入站事件,而出站同样也只能处理出站事件。
借助责任链简单解决一下网络编程中拆包和粘包
拆包和粘包出现的原因:
(1)由于Nagle算法可能会将一些,要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;
(2)接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;
(3)要