1. 程式人生 > >Netty入門之IO(一)

Netty入門之IO(一)

BIO:一請求一應答模型      阻塞同步IO

一個執行緒去監聽客戶端連結,當監聽到客戶端連結時,會為每個客戶端建立一個新的執行緒去進行處理,處理結束,通過輸出流返回應答給客戶端,最後銷燬執行緒。

缺點:由於會每個客戶端請求建立新的執行緒去處理。所以隨著併發量的增加,效率會大大降低。 還有可能出現執行緒堆疊溢位,建立新執行緒失敗等問題。最終會導致無法提供提供服務。

偽非同步IO通訊=BIO+執行緒池    阻塞同步IO

在BIO基礎上增加使用執行緒池管理客戶端請求的執行緒。

當有一個新的客戶端請求時,將客戶端的WebSocket封裝成一個非同步任務。交由執行緒池進行處理。由於執行緒池中可以設定訊息佇列(任務)大小。以及最大執行緒數,所以資源是可控的,無論多少個併發客戶端訪問,都不出現因資源耗盡而造成的down機的情況。

缺點:當大量客戶端接入,併發量很大時,可能會出現執行緒池執行緒阻塞等待。

NIO:非阻塞同步IO

1、緩衝區Buffer:讀資料是從緩衝區讀,寫資料也是寫入緩衝區。所有的資料都是通過緩衝區處理。

2、通道Channel:雙向的,可以讀寫,或同時讀寫。流是單向的,只能讀或寫。

3、多路複用器Selector:Selector一直輪詢Channel。當Channel發生讀寫操作時,該Channel就處於就緒狀態,就會被Selector輪詢出來。通過Selection.key()就可以獲取就緒Channel的集合。之後再進行後續操作。

而由於

AIO:非阻塞非同步IO

1、連線註冊讀寫事件和回撥函式

2、讀寫方法非同步。

3、主動通知程式。

兩種方式獲取結果。

1、java.util.concurrent.Future類來儲存非同步操作的結果,Future get()方法(帶或不帶超時引數)在非同步IO操作完成時獲取其結果。

2、在非同步操作時,傳入回撥的handler

該Handler是java.nio.channels.CompletionHandler介面的實現類。

JDK使用Epoll代替了傳統的Selector實現。而且Epoll沒有最大連結數的限制。可以接入數萬級的客戶端。