2014-03-12 29 views
1

我在Netty4一個問題,一個I/O事件由處理無論是ChannelInboundHandlerChannelOutboundHandler在Netty4,爲什麼讀取和寫入兩者在OutboundHandler

  1. 第一個問題是爲什麼讀取且兩個寫方法在ChannelOutboundHandler
  2. 爲什麼在fireChannelReadComplete()中觸發read()方法?什麼是設計理念?
@Override 
public ChannelPipeline fireChannelReadComplete() { 
    head.fireChannelReadComplete(); 
    if (channel.config().isAutoRead()) { 
     read(); 
    } 
    return this; 
} 

回答

7

入站處理程序都應該處理入站事件。外部刺激(例如從套接字接收的數據)觸發事件。

出站處理程序應該截取您的應用程序發出的操作。

回覆:Q1)read()是一個操作,您可以告訴Netty繼續從套接字讀取入站數據,這就是爲什麼它在出站處理程序中的原因。

回覆:Q2)您通常不會發出read()操作,因爲如果autoRead屬性設置爲true,Netty會自動爲您執行此操作。當典型流程autoRead是:

  1. Netty的觸發時套接字連接的入站事件channelActive,然後發出一個read()請求到其自身(見DefaultChannelPipeline.fireChannelActive()
  2. Netty的響應於read()讀取從插座的東西請求。
  3. 如果讀了某些內容,Netty會觸發channelRead()
  4. 如果有什麼可看,Netty的觸發channelReadComplete()
  5. Netty中發出另一個read()要求,要繼續從套接字讀取。

如果autoRead已關閉,則必須手動發出read()請求。關閉autoRead有時很有用。例如,您可能希望通過將接收到的數據保留在內核空間中來實現反壓機制。