• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • BIO、NIO、AIO網絡編程

    概述

    IO

    • IO是輸入和輸出的縮寫. Java的IO包主要關注的是從目標媒介讀取數據以及輸出數據到目標媒介,目標媒介包括:
      文件
      管道(線程內部通信)
      網絡連接
      內存緩存
      標準輸入、輸出和錯誤輸出

    • 輸出操作
      這里寫圖片描述

    • 輸入操作
      這里寫圖片描述

    • 流從概念上來說是一個連續的數據流。在Java IO中流既可以是字節流(以字節為單位進行讀寫),也可以是字符流(以字符為單位進行讀寫,如Reader/Writer)。你既可以從流中讀取數據,也可以往流中寫數據。流媒介相關聯,原先在目標媒介上的操作都變為對流的操作。InpusStream作為媒介的輸入操作的代理, OutputStream作為目標媒介的輸出操作的代理,原先在數據源和目標媒介上的操作都轉化到了流上的操作。
    • 輸出操作
      這里寫圖片描述
    • 輸入操作
      這里寫圖片描述

    套接字

    • Socket用于描述IP地址和端口, 是一個通信鏈的句柄。應用程序通常通過”套接字”向網絡發出請求或者應答網絡請求。
      以J2SDK-1.3為例,Socket和ServerSocket類庫位于java.net包中。ServerSocket用于服務器端,Socket是建立網絡連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。對于一個網絡連接來說,套接字是平等的,并沒有差別,不因為在服務器端或在客戶端而產生不同級別。
      從簡而論,Socket是作為和更底層的網絡設備(網卡)的代理而存在的。

    網絡編程

    IO操作時的目標媒介是套接字的特殊場景,即網絡IO特指它的的目標媒介是套接字。它是為不同進程(不限于不同終端間)之間的通信而存在的。由于目標媒介是Socket,它是面向網絡的,任何異常的網絡狀態都會影響到網絡IO的操作(包括它的讀寫速度)
    

    BIO
    同步阻塞式IO。BIO是最早的IO操作的API,執行路程如下(每一步操作都是阻塞式的):
    這里寫圖片描述

    Domo:

    這里寫圖片描述

    NIO

    • 同步非阻塞式IO。NIO是第二代IO操作的API,它不再讓開發人員直接操作Socket,而是增加了加新的概念:Selector、Channel、Buffer,開發人員使用的都是這幾個新的對象。

    Channel:

    • Channel通道是對Socket功能的增強,原先在Socket上的操作在NIO中都變為Channel了。原先在Socket上的操作,都可以在Channel上找到替代的方式。
      Channel新增了即時查詢與Channel關聯的Socket的狀態(讀取準備就緒、寫入準備就緒、可接收新連接、有新連接)

    Buffer:

    • Buffer緩沖是作為Channel和業務模塊之間的中介的角色,NIO的API不提供直接往Channel中讀取和寫入數據,只能在Buffer和Channel之間讀寫數據,或者直接和Buffer做讀寫操作。

    SelectionKey

    • SelectionKey是Channel上下文對象,他提供Channel關聯一個與自己相關的對象,以及對于Channel狀態的查詢,可以即時查詢Channel的狀態(讀取準備就緒、寫入準備就緒、可接收新連接、是否可連接)。
    • 我們可以根據SelectionKey來查看Channel是否準備就緒了,如果沒有準備就緒則直接跳過它的處理,等到它準備就緒之后再操作,避免了阻塞線程。

    Selector:

    • Selector選擇器,NIO的最核心組件,支持多路復用(同時管理多個Channel),使用方法是向Selector中注冊Channel并且指定特定的狀態,之后Selector.select()方法可以即時返回特定狀態的SelectionKey集合(SelectionKey中可以獲取Channel)。

    • NIO在同步執行的情況下,只會對對應狀態已經準備就緒的Channel做操作,防止了因為網絡IO而讓線程完全阻塞的情況:
      這里寫圖片描述

    Demo:

    這里寫圖片描述
    這里寫圖片描述

    AIO

    異步非阻塞IO,是最新的IO操作的API,他對于Channel的讀寫也是需要通過Buffer來操作的。但是它完全采用異步回調的方式,提供接收客戶端Channel、從Channel讀取數據、往Channel寫入數據的回調時機,所有的流程都是通過監聽這些時機來串聯起來的:
    

    這里寫圖片描述

    Demo:

    這里寫圖片描述

    對比

    API BIO NIO AIO
    調用方式 同步調用 同步調用 異步調用
    讀寫方式 單個字節讀取,阻塞線程 支持非阻塞,可讀取字節塊 非阻塞,可讀取字節塊
    效率 高(linux沒有性能問題)
    易用性 簡單 需要自己組織線程模型 不需要自己組織線程模型
    調試難度 簡單 簡單 難(異步+線程模型)
    第三方支持 未知 Mina、Netty Talent-aio

    demo代碼

    https://github.com/cx422803902/io.git

    版權聲明:本文為cx422803902原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/cx422803902/article/details/80061964

    智能推薦

    【Java】---BIO、NIO、AIO

    1.同步與異步 同步:是指發出一個請求,在沒有得到結果之前該請求就不會 返回結果,直到請求返回時; 比如燒水,一直在看,直到水燒好之后,才去干別的事。 異步:發出一個請求后,立刻得到了回應,但沒有返回結果,在此階段可以去處理別的事情 比如燒水時,你可以設置一個定時,期間你可以去做別的事情 2.阻塞與非阻塞 阻塞: 是指請求結果返回之前當前的線程會被掛起,此時的線程什么也不會去做 非阻塞:是指請求結...

    BIO、NIO、AIO

    一:BIO 1、網絡編程的基本模型是C/S模型,即兩個進程間的通信。 2、服務端提供IP和監聽端口,客戶端通過連接操作想服務端監聽的地址發起連接請求,通過三次握手連接,如果連接成功建立,雙方就可以通過套接字進行通信。 3、傳統的同步阻塞模型開發中,ServerSocket負責綁定IP地址,啟動監聽端口;Socket負責發起連接操作。連接成功后,雙方通過輸入和輸出流進行同步阻塞式通信。  ...

    BIO,NIO,AIO總結

    BIO,NIO,AIO總結 通過對Linux系統的網絡IO模型映射到java的IO實現.從而解釋為什么BIO是同步阻塞,NIO是同步非阻塞,AIO是異步. Linux系統I/O基礎 Linux系統用戶態與內核態 系統內存分為: 用戶態內存和內核態內存 如上圖所示,從宏觀上來看,Linux操作系統的體系架構分為用戶態和內核態(或者用戶空間和內核)。內核從本質上看是一種軟件——...

    BIO、NIO、AIO 講解

    一、前沿 在通信框架中經常使用到的三種通信模式,即 BIO、NIO 和 AIO,它們也是面試中經常被問到的,如果學會了它們將會給你帶來薪資的變化哦。下面分別對三者介紹一下,通過示例理解其用法 下面先通過一張圖來簡單了解一下三者,如下所示: 同步阻塞IO : 用戶進程發起一個IO操作以后,必須等待IO操作的真正完成后,才能繼續運行 同步非阻塞IO: 用戶進程發起一個IO操作以后,可做其它事情,但用戶...

    BIO, NIO, AIO

    同步,異步,阻塞,非阻塞 同步:a 事件必須等到 b 事件完成才可以繼續執行/返回 異步:a 事件可以先執行/返回,不需要等待 b 事件的完成,而是通過回調處理 b 事件的返回結果 阻塞:當發起一次請求時,調用者一直等待結果的返回,只有當條件滿足時,才繼續處理后續的工作 非阻塞:當發起一次請求時,調用者不用一直等待結果的返回,可以先去做其他的事情 1、BIO(Blocking IO) 同步阻塞 i...

    猜你喜歡

    BIO、NIO、AIO概述

    1.1 阻塞與非阻塞的概念 1.2 同步與異步的概念 1.3 BIO、NIO與AIO概述...

    BIO,NIO,AIO 總結

    熟練掌握 BIO,NIO,AIO 的基本概念以及一些常見問題是你準備面試的過程中不可或缺的一部分,另外這些知識點也是我們學習 Netty 的基礎。 文章目錄 BIO,NIO,AIO 總結 1. BIO (Blocking I/O) 1.1 傳統 BIO 1.2 偽異步 IO 1.3 代碼示例 1.4 總結 2. NIO (New I/O) 2.1 NIO 簡介 2.2 NIO的特性/NIO與IO區...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    精品国产乱码久久久久久蜜桃不卡