2.1.2 同步阻塞式I/O創建的TimeServer源碼分析
(備注:以下代碼行號均對應源代碼中實際行號。)

代碼清單2-1 同步阻塞I/O的TimeServer

TimeServer根據傳入的參數設置監聽端口,如果沒有入參,使用默認值8080,29行通過構造函數創建ServerSocket,如果端口合法且沒有被占用,服務端監聽成功。32~35行通過一個無限循環來監聽客戶端的連接,如果沒有客戶端接入,則主線程阻塞在ServerSocket的accept操作上。啟動TimeServer,通過JvisualVM打印線程堆棧,我們可以發現主程序確實阻塞在accept操作上,如圖2-2所示。

圖2-2 主程序線程堆棧
當有新的客戶端接入的時候,執行代碼34行,以Socket為參數構造TimeServerHandler對象,TimeServerHandler是一個Runnable,使用它為構造函數的參數創建一個新的客戶端線程處理這條Socket鏈路。下面我們繼續分析TimeServerHandler的代碼。

代碼清單2-2 同步阻塞I/O的TimeServerHandler


37行通過BufferedReader讀取一行,如果已經讀到了輸入流的尾部,則返回值為null,退出循環。如果讀到了非空值,則對內容進行判斷,如果請求消息為查詢時間的指令"QUERY TIME ORDER"則獲取當前最新的系統時間,通過PrintWriter的println函數發送給客戶端,最后退出循環。代碼47~64行釋放輸入流、輸出流、和Socket套接字句柄資源,最后線程自動銷毀并被虛擬機回收。
在下一個小結,我們將介紹同步阻塞I/O的客戶端代碼,然后分別運行服務端和客戶端,查看下程序的運行結果。