在網路通信中,Socket通信的雙方分為服務端與客戶端,在Java NIO 的實現中採用Socket/ServerSocket, SocketChannel/ServerSocketChannel分別表示客戶端與服務端對象及程式與所操作的Socket間的連接通道。 在Mina框架中採用IoAccep ...
在網路通信中,Socket通信的雙方分為服務端與客戶端,在Java NIO 的實現中採用Socket/ServerSocket, SocketChannel/ServerSocketChannel分別表示客戶端與服務端對象及程式與所操作的Socket間的連接通道。
在Mina框架中採用IoAcceptor來表示接受連接的服務端,而用IoConnector表示客戶端。這裡我認為IoAccepto/IoConnector更像是SocketChannel/ServerSocketChannel的進一步抽象,表示的是應用程式 與 Socket間的連接通道。
首先看IoAcceptor的類圖關係,這裡只關心Socket相關的部分:
可見IoAcceptor和IoConnector都繼承自IoService,IoConnector的實現與IoAcceptor類似,圖中未給出。在實際的Socket通信編程中,最終應用的類是SocketAcceptor。事實上Mina對NIO的實現更多的體現在AbstractPollingIoAcceptor(以及對應的AbstractPollingIoConnector)中,在其中定義了內部類Acceptor來實現對到達連接的輪詢處理。內部類Acceptor實現了介面Runnable, AbstractIoService本身持有Executor,Acceptor執行的輪詢任務交由Executor處理。
值得註意的是此處的Executor可以由程式開發者指定具體的類型,在未指定的情況下,其預設的實現是CachedThreadPool。事實上對於IoAcceptor來說,每個Acceptor對應的Socket為一個,對到達連接的輪詢處理已交由Acceptor線程處理,此處仍舊定義了線程池似乎多此一舉。
對於到達的連接則交由AbstractPollingIoAcceptor其本身持有的processor處理。在未明確指定的情況下其本身的processor是SimpleIoProcessorPool類型,關於processor是另外一個話題。
由此可以看到,IoAcceptor本身占用一個線程完成對到達連接的接收處理,後續連接建立後會話中通信的處理則交由Processor負責。