国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Netty開篇——NIO章上(三)

這篇具有很好參考價值的文章主要介紹了Netty開篇——NIO章上(三)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Java NIO基本介紹

  1. java non-blocking?I/O?稱為NIO(也叫New?IO)。JDK4開始提供,同步非阻塞
  2. 相關(guān)內(nèi)容在?java.nio 包及子包下,對java.io 包中的很多類進(jìn)行改寫。
  3. 三大核心: Channel(通道),Buffer(緩沖區(qū)),Selector(選擇器)
  4. NIO是面向緩沖區(qū)或者面向塊編程。數(shù)據(jù)讀取到一個它后處理的緩沖區(qū),需要時可在緩沖區(qū)中前后移動,這就增加了處理過程中的靈活性,使用它可以提供非阻塞式的高伸縮性網(wǎng)絡(luò)
  5. NIO的非阻塞模式,使一個線程從某通道發(fā)送請求或者讀取數(shù)據(jù),但是它僅能得到目前可用的數(shù)據(jù),如果目前沒有數(shù)據(jù)可用時,就什么都不會獲取,而不是保持線程阻塞,所以直至數(shù)據(jù)可以讀取之前,該線程可以繼續(xù)做其他的事情。
  6. 通俗理解: NIO 是可以做到用一個線程來處理多個操作。假設(shè)有 10000 個請求過來,根據(jù)實際情況,可以分配50 或者 100 個線程來處理。不像之前的阻塞IO 那樣,非得分配 10000 個。
  7. HTTP2.0 使用了多路復(fù)用的技術(shù),做到同一個連接并發(fā)處理多個請求,而且并發(fā)請求的數(shù)量比 HTTP1.1 大了好幾個數(shù)量級
  8. 基本案例

Netty開篇——NIO章上(三),Netty,nio,java

NIO 和 BIO 的比較

  1. BIO以流的方式處理數(shù)據(jù),而NIO以塊的方式處理數(shù)據(jù),I/O塊的效率比I/O流高很多
  2. BIO 是阻塞的,NIO則是非阻塞的
  3. BIO 基于字節(jié)流和字符流進(jìn)行操作,而NIO基于Channel(通道)和Buffer(緩沖區(qū))進(jìn)行操作,數(shù)據(jù)總是從通道讀取到緩沖區(qū)中,或者從緩沖區(qū)寫入到通道中。Selector 選擇器用于監(jiān)聽多個通道的事件(比如:連接請求,數(shù)據(jù)到達(dá)等),因此使用單個線程就可以監(jiān)聽多個客戶端通道

Selector、Channel 和 Buffer 的關(guān)系圖

  1. 每個channel都會對應(yīng)一個Buffer
  2. 一個Selector對應(yīng)一個線程
  3. 多個channel會注冊到其selector
  4. Selector會根據(jù)不同的Event,在各個Channel上切換
  5. channel 是雙向的,可以返回底層操作系統(tǒng)的情況,比如Linux,底層的操作系統(tǒng)通道就是雙向的.
  6. Buffer是一個內(nèi)存塊,底層是一個數(shù)組
  7. 數(shù)據(jù)的讀取寫入是通過 Buffer,這個和BIO有所區(qū)別,BIO 中要么是輸入流,或者是輸出流,不能雙向,但是NIO的Buffer是可以讀也可以寫,需要flip()切換

?Netty開篇——NIO章上(三),Netty,nio,java

緩沖區(qū)(Buffer)

  1. Buffer本質(zhì)上是一個可以讀寫數(shù)據(jù)的內(nèi)存塊,可以理解成是一個容器對象(含數(shù)組),該對象提供了一組方法,可以更輕松地使用內(nèi)存塊,Buffer對象內(nèi)置了一些機(jī)制,能夠跟蹤和記錄緩沖區(qū)的狀態(tài)變化情況。Channel 讀寫的數(shù)據(jù)都必須經(jīng)由Buffer
  2. Buffer是父類、抽象類,類的層級關(guān)系圖
    1. Netty開篇——NIO章上(三),Netty,nio,java
  3. 常用Buffer子類

    • ByteBuffer?存儲字節(jié)數(shù)據(jù)到緩沖區(qū)
    • shortBuffer?存儲字符串?dāng)?shù)據(jù)到緩沖區(qū)
    • CharBuffer?存儲字符數(shù)據(jù)到緩沖區(qū)
    • IntBuffer?存儲整數(shù)數(shù)據(jù)到緩沖區(qū)
    • LongBuffer?存儲長整型教據(jù)到緩沖區(qū)
    • DoubleBuffer?存儲小數(shù)到緩沖區(qū)
    • FloatBuffer?存儲小數(shù)到緩沖區(qū)
  4. 這些Buffer都把數(shù)據(jù)存于自己類型的數(shù)組

  5. Buffer類的四個屬性:
    • Capacity:容量,即可以容納的最大數(shù)據(jù)量;在緩沖區(qū)創(chuàng)建時被設(shè)定并且不能改變
    • Limit:表示緩沖區(qū)的當(dāng)前終點,不能對緩沖區(qū)超過極限的位置進(jìn)行讀寫操作。且極限是可以修改的
    • Position:位置,下一個要被讀寫的元素的索引,每次讀寫緩沖區(qū)數(shù)據(jù)時都會改變改值,為下次讀寫做準(zhǔn)備
    • Mark:標(biāo)記

Netty開篇——NIO章上(三),Netty,nio,java

Netty開篇——NIO章上(三),Netty,nio,java

Buffer類相關(guān)方法

public abstract class Buffer{
//JDK1.4時,引入的api
public final int capacity()//返回此緩沖區(qū)的容量
public final int position()//返回此緩沖區(qū)的位置
public final Buffer position(int newPositio)//設(shè)置此緩沖區(qū)的位置
public final int limit()//返回此緩沖區(qū)的限制
public final Buffer limit(int newLimit)//設(shè)置此緩沖區(qū)的限制
public final Buffer mark()//在此緩沖區(qū)的位置設(shè)置標(biāo)記
public final Buffer reset()//將此緩沖區(qū)的位置重置為以前標(biāo)記的位置
public final Buffer clear()//清除此緩沖區(qū),即將各個標(biāo)記恢復(fù)到初始狀態(tài),但是數(shù)據(jù)并沒有真正擦除,
public final Buffer flip()//反轉(zhuǎn)此緩沖區(qū)
public final Buffer rewind()//重繞此緩沖區(qū)
public final int remaining()//返回當(dāng)前位置與限制之間的元素數(shù)
public final boolean hasRemaining()//告知在當(dāng)前位置和限制之間是否有元素
public abstract boolean isReadOnly()://告知此緩沖區(qū)是否為只讀緩沖區(qū)
//JDK1.6時引入的api
public abstract boolean hasArray();//告知此緩沖區(qū)是否具有可訪問的底層實現(xiàn)數(shù)組
public abstract Object array();//返回此緩沖區(qū)的底層實現(xiàn)數(shù)組
public abstract int arrayOffset();/返回此緩沖區(qū)的底層實現(xiàn)數(shù)組中第一個緩沖區(qū)元素的偏移量
public abstract boolean is Direct();//告知此緩沖區(qū)是否為直接緩沖區(qū)
}

ByteBuffer

  1. 除了boolean,其他基本類型都有一個Buffer類型與之相對應(yīng),最常用的自然是 ByteBuffer 類(二進(jìn)制數(shù)據(jù)),該類的主要方法如下:
public abstract class ByteBuffer(
//緩沖區(qū)創(chuàng)建相關(guān)api
public static ByteBuffer allocateDirect(int capacity)//創(chuàng)建直接緩沖區(qū)
public static ByteBuffer allocate(int capacity)//設(shè)置緩沖區(qū)的初始容量
public static ByteBuffer wrap(byte[] array)//把一個數(shù)組放到緩沖區(qū)中使用
//構(gòu)造初始化位置offset和上界length的緩沖區(qū)
public static ByteBuffer wrap(byte[] array,int offset, int length)
//緩存區(qū)存取相關(guān)API
public abstract byte get()//從當(dāng)前位置position上get,get之后,position會自動+1 
public abstract byte get(int index);//從絕對位置get
public abstract ByteBuffer put(byte b);//從當(dāng)前位置上添加,put之后,position會自動+1 
public abstract ByteBuffer put(int index,byte b);//從絕對位置上put

關(guān)于Buffer的注意事項和細(xì)節(jié)

  1. ByteBuffer支持類型化的put和get,數(shù)據(jù)類型必須保持一致,否則可能有 BufferUnderflowException 異常。
  2. Buffer支持轉(zhuǎn)換為只讀buffer,調(diào)用asReadOnlyBuffer()
  3. NIO還提供了MappedByteBuffer,可以讓文件直接在內(nèi)存(堆外內(nèi)存) 中進(jìn)行修改,而如何同步到文件由NIO來完成.
  4. NIO還支持通過多個Buffer(buffer數(shù)組)完成讀寫操作即 Scattering(分散)和 Gathering(合并)

?Netty開篇——NIO章上(三),Netty,nio,java

Netty開篇——NIO章上(三),Netty,nio,java文章來源地址http://www.zghlxwxcb.cn/news/detail-794456.html

到了這里,關(guān)于Netty開篇——NIO章上(三)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 以 Java NIO 的角度理解 Netty

    以 Java NIO 的角度理解 Netty

    上篇文章《Netty 入門指南》主要涵蓋了 Netty 的入門知識,包括 Netty 的發(fā)展歷程、核心功能與組件,并且通過實例演示了如何使用 Netty 構(gòu)建一個 HTTP 服務(wù)器。由于 Netty 的抽象程度較高,因此理解起來可能會更加復(fù)雜和具有挑戰(zhàn)性,所以本文將通過 Java NIO 的處理流程與 Netty 的

    2024年02月12日
    瀏覽(20)
  • Java NIO 圖解 Netty 服務(wù)端啟動的過程

    了解整體Netty常用的核心組件后,并且對比了傳統(tǒng)IO模式。在對比過程中,找到了傳統(tǒng)IO對應(yīng)Netty中是如何實現(xiàn)的。最后我們了解到在netty中常用的那些組件。 本文在了解下這些核心組件的前提下,進(jìn)一步了解組件如何在整個服務(wù)器啟動過程如何被創(chuàng)建,如何組件之間配合來使

    2024年02月11日
    瀏覽(19)
  • Java網(wǎng)絡(luò)編程(二)NIO和Netty實現(xiàn)多人聊天功能
  • 快速入門Java NIO(Not I/O)的網(wǎng)絡(luò)通信框架--Netty

    快速入門Java NIO(Not I/O)的網(wǎng)絡(luò)通信框架--Netty

    了解netty前需要對nio有一定認(rèn)識,該筆記基礎(chǔ)來自bilinbili黑馬,在此基礎(chǔ)上自己學(xué)習(xí)的筆記,添加了一些自己的理解 了解java 非阻塞io編程 1.1 Netty 是什么? Netty 是一個異步(基于多線程)的、基于事件驅(qū)動(多路復(fù)用的那寫事件驅(qū)動)的網(wǎng)絡(luò)應(yīng)用框架,用于快速開發(fā)可維護(hù)、高性能的

    2024年01月17日
    瀏覽(25)
  • 【netty基礎(chǔ)四】netty與nio

    【netty基礎(chǔ)四】netty與nio

    阻塞I/O在調(diào)用InputStream.read()方法時是 阻塞的,它會一直等到數(shù)據(jù)到來 (或超時)時才會返回; 同樣,在調(diào)用ServerSocket.accept()方法時,也會一直 阻塞到有客戶端連接 才會返回,每個客戶端連接成功后,服務(wù)端都會啟動一個線程去處理該客戶端的請求。 阻塞I/O的通信模型示意

    2024年02月10日
    瀏覽(21)
  • 聊聊分布式架構(gòu)06——[NIO入門]簡單的Netty NIO示例

    聊聊分布式架構(gòu)06——[NIO入門]簡單的Netty NIO示例

    目錄 Java NIO和Netty NIO比較 Java NIO: Netty: Netty NIO中的主要模塊 Transport(傳輸層) Buffer(緩沖區(qū)) Codec(編解碼器) Handler(處理器) EventLoop(事件循環(huán)) Bootstrap和Channel(引導(dǎo)和通道) Future和Promise(異步編程) Netty示例 服務(wù)端時序圖 服務(wù)端代碼 客戶端時序圖 客戶端代碼

    2024年02月07日
    瀏覽(54)
  • NIO和netty的常用類

    給ServerBootstrap配置兩個EventLoopGroup,一個建立連接,一個處理網(wǎng)絡(luò)io。 EventLoopGroup給EventLoop分配線程。 在 Netty 中,EventLoop 通過不斷輪詢 Selector 來檢測 Channel 上發(fā)生的事件,當(dāng) Channel 上的事件到達(dá)時,EventLoop 會將事件傳入 相應(yīng)的Channel 的成員變量 ChannelPipeline 中,經(jīng)過所有C

    2024年01月25日
    瀏覽(18)
  • Netty和傳統(tǒng)NIO之間的比較

    Netty回顯服務(wù)器實現(xiàn): 上述代碼是一個使用Netty實現(xiàn)的回顯服務(wù)器。讓我們逐行解釋代碼的實現(xiàn): 首先,我們創(chuàng)建了兩個 NioEventLoopGroup ,一個用于接收客戶端連接(bossGroup),另一個用于處理客戶端連接上的請求(workerGroup)。 然后,我們創(chuàng)建一個 ServerBootstrap 實例,并配置

    2024年01月16日
    瀏覽(24)
  • netty(二):NIO——處理可寫事件

    在服務(wù)端一次性無法把數(shù)據(jù)發(fā)送完的情況下,需要注冊可寫事件 服務(wù)端一次性是否能夠把數(shù)據(jù)全部發(fā)送完成取決于服務(wù)端的緩沖區(qū)大小,該緩沖區(qū)不受程序控制 判斷ByteBuffer是否仍有剩余,如果有剩余注冊可寫事件 監(jiān)聽可寫事件,判斷數(shù)據(jù)是否寫完,數(shù)據(jù)寫完需要 客戶端 服

    2024年02月11日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包