1. 程式人生 > >基於Java NIO的Socket通訊

基於Java NIO的Socket通訊

Java NIO模式的Socket通訊,是一種同步非阻塞IO設計模式,它為Reactor模式實現提供了基礎。

下面看看,Java實現的一個服務端和客戶端通訊的例子。

NIO模式的基本原理描述如下:

服務端開啟一個通道(ServerSocketChannel),並向通道中註冊一個選擇器(Selector),這個選擇器是與一些感興趣的操作的標識(SelectionKey,即通過這個標識可以定位到具體的操作,從而進行響應的處理)相關聯的,然後基於選擇器(Selector)輪詢通道(ServerSocketChannel)上註冊的事件,並進行相應的處理。

客戶端在請求與服務端通訊時,也可以向伺服器端一樣註冊(比服務端少了一個SelectionKey.OP_ACCEPT操作集合),並通過輪詢來處理指定的事件,而不必阻塞。

下面的例子,主要以服務端為例,而客戶端只是簡單地傳送請求資料和讀響應資料。

服務端實現,程式碼如下所示:

客戶端實現,程式碼如下所示:

上述實現,NioTcpServer服務執行緒啟動後,監聽指定埠,等待客戶端請求的到來,然後NioTcpClient客戶端程序啟動併發送請求資料,服務端接收到請求資料後,響應客戶端(將請求的資料作為響應資料寫回到客戶端通道SocketChannel,並等待客戶端處理)。

實際上,客戶端和服務端可以採用同樣輪詢的非阻塞模式來實現,為簡單實現在這個例子中我們把客戶端角色簡化了,而實際上它可能在另一個系統通訊中充當服務端角色。

另外,上面對於不同事件是採用非執行緒的方式來處理,只是簡單地呼叫處理的方法。在實際中,如果存在大量連線、讀寫請求,可以考慮使用執行緒池來更大程度地併發處理,提高服務端處理的速度和吞吐量,提升系統性能。