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