我在Netty4中有一个问题,I / O事件由ChannelInboundHandler
或ChannelOutboundHandler
ChannelOutboundHandler
中的读写方法? read()
中触发fireChannelReadComplete()
方法?什么是设计理念?@Override
public ChannelPipeline fireChannelReadComplete() {
head.fireChannelReadComplete();
if (channel.config().isAutoRead()) {
read();
}
return this;
}
答案 0 :(得分:7)
入站处理程序应该处理入站事件。事件由外部刺激触发,例如从套接字接收的数据。
出站处理程序应该拦截应用程序发出的操作。
Re:Q1)read()
是一个可以发出的操作,告诉Netty继续从套接字读取入站数据,这就是它在出站处理程序中的原因。
Re:Q2)您通常不会发出read()
操作,因为如果autoRead
属性设置为true
,Netty会自动为您执行此操作。 autoRead
开启时的典型流程:
channelActive
,然后向自己发出read()
个请求(请参阅DefaultChannelPipeline.fireChannelActive()
)read()
请求。channelRead()
。channelReadComplete()
read()
请求以继续从套接字读取。如果autoRead
已关闭,您必须手动发出read()
请求。关闭autoRead
有时会很有用。例如,您可能希望通过将接收的数据保留在内核空间中来实现背压机制。