官术网_书友最值得收藏!

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的客戶端代碼,然后分別運行服務端和客戶端,查看下程序的運行結果。

主站蜘蛛池模板: 牙克石市| 青冈县| 卢湾区| 沭阳县| 东兰县| 关岭| 民县| 简阳市| 达拉特旗| 集贤县| 阿合奇县| 胶州市| 革吉县| 克东县| 丰宁| 潞城市| 龙江县| 沿河| 定州市| 密云县| 环江| 兴义市| 凭祥市| 香格里拉县| 云南省| 上高县| 宿迁市| 盐边县| 延边| 莲花县| 威宁| 台前县| 文安县| 措美县| 安国市| 孝昌县| 阳原县| 始兴县| 广灵县| 石渠县| 静乐县|