2.3.2 NIO服務端序列圖
NIO服務端通信序列圖如圖2-10所示。

圖2-10 NIO服務端通信序列圖
下面,我們對NIO服務端的主要創建過程進行講解和說明,作為NIO的基礎入門,我們將忽略掉一些在生產環境中部署所需要的一些特性和功能。
步驟一:打開ServerSocketChannel,用于監聽客戶端的連接,它是所有客戶端連接的父管道,代碼示例如下。

步驟二:綁定監聽端口,設置連接為非阻塞模式,示例代碼如下。

步驟三:創建Reactor線程,創建多路復用器并啟動線程,代碼如下。

步驟四:將ServerSocketChannel注冊到Reactor線程的多路復用器Selector上,監聽ACCEPT事件,代碼如下。

步驟五:多路復用器在線程run方法的無限循環體內輪詢準備就緒的Key,代碼如下。

步驟六:多路復用器監聽到有新的客戶端接入,處理新的接入請求,完成TCP三次握手,建立物理鏈路,代碼示例如下。

步驟七:設置客戶端鏈路為非阻塞模式,示例代碼如下。

步驟八:將新接入的客戶端連接注冊到Reactor線程的多路復用器上,監聽讀操作,用來讀取客戶端發送的網絡消息,代碼如下。

步驟九:異步讀取客戶端請求消息到緩沖區,示例代碼如下。

步驟十:對ByteBuffer進行編解碼,如果有半包消息指針reset,繼續讀取后續的報文,將解碼成功的消息封裝成Task,投遞到業務線程池中,進行業務邏輯編排,示例代碼如下。

步驟十一:將POJO對象encode成ByteBuffer,調用SocketChannel的異步write接口,將消息異步發送給客戶端,示例代碼如下。

注意:如果發送區TCP緩沖區滿,會導致寫半包,此時,需要注冊監聽寫操作位,循環寫,直到整包消息寫入TCP緩沖區,此處不贅述,后續Netty源碼分析章節會詳細分析Netty的處理策略。
當我們了解創建NIO服務端的基本步驟之后,下面我們將前面的時間服務器程序通過NIO重寫一遍,讓大家能夠學習到完整版的NIO服務端創建。