Netty之WebSocket和四種IO介紹


Netty簡介

  一、什么是netty?

      高性能 事件驅動

      異步非堵塞 基於NIO的客戶端,服務器端編程框架

      穩定性和伸縮性   

  二、Netty的使用場景

      高性能領域
       多線程並發領域
       異步通信領域

四種IO介紹

  1、BIO通信

     (1)一個線程負責連接
    (2)一個請求一個應答
    (3)缺乏彈性伸縮能力 當客戶端訪問增大,線程造成進程宕機。不能對外服務。

  2、偽異步IO通信

     (1)線程池負責連接 當有新的客戶端進來,將客戶端的socket封裝成Task投入線程池。
    (2)m請求n應答 將所有的請求放到一個線程池中,由線程池來分配線程;做到異步通信。
    (3)線程池阻塞 線程池可以設置最大訪問數。並發不斷增加,可能造成阻塞。

  3、NIO通信

    (1)緩沖區Buffer ————>>> 他是一個對象,包含讀和寫的數據,所有數據都是用緩沖區處理的。

    (2)通道Channel ————>>> 他就像是一個自來水管一樣,網絡數據通過Channel讀取或寫入,通道與流的不同之處在於通道是雙向的,流只是在一個水平線上移動,一個流他必須是inputStrem或outputStrem的子類,通道可以用於讀寫,或者二者同時進行。

    (3)多路復用器Selector ————>>> 它會不斷的輪詢注冊在其上的channel,如果channel發生讀或寫事件,那么這個channel就處於就緒狀態,會被selector輪詢出來,然后通過selectorKey獲取就channel集合,進行后續的io操作。由於jdk使用epoll()替代傳統的selector實現,所以他並沒有最大連接句柄限制,也就意味着只需要一個負責輪詢selector的線程就可以接入成千上萬的channel.

  4、AIO通信

     (1)連接注冊讀寫事件和回調函數

    (2)讀寫方法異步

    (3)主動通知程序

    總結:AIO異步通道通過兩種方式獲得操作結果,第一種就是通過返java.util.concurrent.Futur對象,第二種方式是為操作提供一個回調參數java.nio.channels.CompletionHandler,這個回調類包含completed,failed兩個方法。那么AIO的套接字通道是真正的異步非阻塞io,他不需要對注冊的多路復用器進行輪詢操作就能實現異步讀寫,簡化了NIO模型,這就是AIO通信。

Netty的WebSocket通信實現

  一、Netty實現WebScoket通信案例

       (1)編寫存儲整個工程的全局配置類 ===》 這里需要有一個Channel對象來存儲每一個接入進來的客戶端 ===》 ChannelGroup對象 ===》為它賦值的是一個默認的ChannelGroup(DefaultChannelGroup)這里他需要一個GlobalEventExecutor.INSTANCE參數。

    (2)編寫WebSocket核心類。
這個類繼承了SimpleChannelInboundHandler抽象類,同時這個抽象類又繼承了ChannelHandlerAdapter類,然后重寫ChannelHandlerAdapter類中的channelActive、channelInactive、channelReadComplete、exceptionCaught四個方法和該抽象類的messageReceived方法。在重寫messageReceived方法時編寫需要的業務處理方法和握手請求業務方法就行了。

    (3)編寫初化連接時的各個組件
這個類是繼承了ChannelInitializer抽象類。重寫默認的initChannel方法,調用傳入的socketChannel對象通道,將各個組件寫入該對象。

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM