1.I/O模型說明
- 簡(jiǎn)單理解:通過什么方式去發(fā)送和接收屬性
- java支持3中網(wǎng)絡(luò)編程模型I/O模式:BIO (同步阻塞)、 NIO(同步非阻塞)、 AIO(異步非阻塞)
2.NIO
同步非阻塞璧坟,服務(wù)器實(shí)現(xiàn)模式為一個(gè)線程處理多個(gè)請(qǐng)求(連接),即客戶端發(fā)送的連接請(qǐng)求都會(huì)注冊(cè)到多路復(fù)用器上桅咆,多路復(fù)用器輪詢到連接有 I/O 請(qǐng)求就進(jìn)行處理斗遏,jdk1.4之后開始支持,一個(gè)線程可以處理多個(gè)讀寫
NIO介紹:
- NIO 有三大核心部分:Channel(通道)梅猿,Buffer(緩沖區(qū)), Selector(選擇器)
- NIO是 面向緩沖區(qū)編程的氓辣。數(shù)據(jù)讀取到一個(gè)緩沖區(qū)中,需要時(shí)可在緩沖區(qū)中前后移動(dòng)袱蚓,這就增加了處理過程中的靈活性钞啸,使用它可以提供非阻塞式的高伸縮性網(wǎng)絡(luò)
- . Java NIO 的非阻塞模式,使一個(gè)線程從某通道發(fā)送請(qǐng)求或者讀取數(shù)據(jù)喇潘,但是它僅能得到目前可用的數(shù)據(jù)体斩,如果目前沒有數(shù)據(jù)可用時(shí),就什么都不會(huì)獲取颖低,而不是保持線程阻塞絮吵,所以直至數(shù)據(jù)變的可以讀取之前,該線程可以繼續(xù)做其他的事情忱屑。 非阻塞寫也是如此蹬敲,一個(gè)線程請(qǐng)求寫入一些數(shù)據(jù)到某通道暇昂,但不需要等待它完全寫入, 這個(gè)線程同時(shí)可以去做別的事情伴嗡。通俗理解:NIO 是可以做到用一個(gè)線程來處理多個(gè)操作的急波。假設(shè)有 10000 個(gè)請(qǐng)求過來,根據(jù)實(shí)際情況,可以分配50 或者 100 個(gè)線程來處理瘪校。不像之前的阻塞 IO 那樣澄暮,非得分配 10000 個(gè)
NIO和 BIO的比較
- BIO 以流的方式處理數(shù)據(jù),而 NIO 以緩沖區(qū)的方式處理數(shù)據(jù),緩沖區(qū) I/O 的效率比流 I/O 高很多
- BIO 是阻塞的,NIO則是非阻塞的
- BIO 基于字節(jié)流和字符流進(jìn)行操作阱扬,而 NIO 基于 Channel(通道)和 Buffer(緩沖區(qū))進(jìn)行操作赏寇,數(shù)據(jù)總是從通道讀取到緩沖區(qū)中,或者從緩沖區(qū)寫入到通道中价认。Selector(選擇器)用于監(jiān)聽多個(gè)通道的事件(比如:連接請(qǐng)求, 數(shù)據(jù)到達(dá)等)自娩,因此使用單個(gè)線程就可以監(jiān)聽多個(gè)客戶端通道
緩沖區(qū)Buffer
緩沖區(qū)本質(zhì)上是一個(gè)可以讀寫數(shù)據(jù)的內(nèi)存塊用踩,可以理解成是一個(gè)數(shù)組,該對(duì)象提供了一組方法忙迁,可以更輕松地使用內(nèi)存塊脐彩,緩沖區(qū)對(duì)象內(nèi)置了一些機(jī)制,能夠跟蹤和記錄緩沖區(qū)的狀態(tài)變化情況姊扔。Channel 提供從網(wǎng)絡(luò)讀取數(shù)據(jù)的渠道惠奸,但是讀取或?qū)懭氲臄?shù)據(jù)都必須經(jīng)由 Buffer
通道Channel
通常來說NIO中的所有IO都是從 Channel(通道) 開始的。NIO 的通道類似于流恰梢,但有些區(qū)別如下:
- 通道可以讀也可以寫佛南,流一般來說是單向的(只能讀或者寫,所以之前我們用流進(jìn)行IO操作的時(shí)候需要分別創(chuàng)建一個(gè)輸入流和一個(gè)輸出流)
- 通道可以異步讀寫
- 通道總是基于緩沖區(qū)Buffer來讀寫
選擇器Selector
可以用一個(gè)線程嵌言,處理多個(gè)的客戶端連接嗅回,就會(huì)使用到NIO的Selector(選擇器). Selector 能夠檢測(cè)
多個(gè)注冊(cè)的服務(wù)端通道上是否有事件發(fā)生,如果有事件發(fā)生摧茴,便獲取事件然后針對(duì)每個(gè)事件進(jìn)行相應(yīng)的處理绵载。這樣就可以只用一個(gè)單線程去管理多個(gè)通道,也就是管理多個(gè)連接和請(qǐng)求