国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Netty組件入門學習

qpal / 2329人閱讀

摘要:可以用來接收入站事件和數據,隨后使用應用程序的業務邏輯進行處理。因為用戶并不是關心所有的事件,因此提供了抽象類和。抽象類最常見的一個情況,你的應用程序會利用一個來接受解碼消息,并對該數據應用業務邏輯。

Channel、EventLoop和ChannelFuture

Channel——Socket;

EventLoop——控制流、多線程處理、并發

ChannelFuture異步通知

Channel接口

基于I/O操作(例如:bind()、connect()、read()和write())依賴于底層網絡傳輸提供的原語。在基于Java的網絡編程中,其基本構造為類Socket。

Netty的Channel接口所提供的API,大大降低了直接使用Socket類的復雜性。

Channel擁有許多預定義的、專門化實現的廣泛類層次結構的根,如下:

EmbeddedChannel

LocalServerChannel

NioDatagramChannel

NioSctpChannel

NioSocketChannel

EventLoop接口

EventLoop定義了Netty的核心抽象,用于處理連接的生命周期中所發生的事件。

Channel、EventLoop、Thread、EventLoopGroup關系示意圖

一個EventLoopGroup包含一個或者多個EventLoop

一個EventLoop在它的生命周期內只和一個Thread綁定

所有由EventLoop處理的I/O事件都將在它專有的Thread上被處理

一個Channel在它的生命周期內只注冊于一個EventLoop

一個EventLoop可能會被分配一個或多個Channel

一個給定Channel的I/O操作都是由相同的Thread執行的,實際上消除了對于同步的需要

ChanneFuture接口

Netty中所有的I/O操作都是異步的,因為一個操作不可能立即返回,所以我們需要一種用于在之后的某個時間點確定其結果的方法。

因此Netty提供了ChannelFuture接口,其addListener()方法注冊了一個ChannelFutureListener,以便在某個操作完成時(無論是否成功)得到通知。

ChannelHandler和ChannelPipeline

主要用來管理數據流已經執行應用程序處理邏輯

ChannelHandler接口

ChannelHandler充當了所有處理入站和出站數據的應用程序邏輯的容器。

ChannelHandler可專門用于幾乎任何類型的動作,例如將數據從一種格式轉換為另外一種格式,或者處理轉換過程中所拋出的異常。

ChannelHandler可以用來接收入站事件和數據,隨后使用應用程序的業務邏輯進行處理。當你的客戶端需要發送響應時,可以從ChannelInboundhandler沖刷數據。

你的應用程序的業務邏輯通常駐留在一個或者多個ChannelInboundHandler中。

ChannelPipeline

ChannelPipeline是ChannelHandler鏈的容器,并定義用于在該鏈上傳播入站和出站事件流的API。當Channel被創建時,它會被自動地分配到它專屬的ChannelPipeline。

ChannelHandler被安裝到ChannelPipeline中過程如下:

一個ChannelInitializer的實現被注冊到了ServerBootstrap中

當ChannelInitializer.initChannel()方法被調用時,ChannelInitalizer將在ChannelPipeline中安裝一組自定義的ChannelHandler

ChannelInitializer將它自己從ChannelPipeline中移除

?ChannelHandler可以讓事件流經ChannelPipeline,它們是在應用程序的初始化或者引導階段被安裝的。這些對象接收事件、執行它們所實現的處理邏輯,并將數據傳遞給鏈中的下一個ChannelHandler。它們的執行順序是由它們被添加的順序決定的

ChannelPipeline是這些ChannelHandler的編排順序。

入站和出站ChannelHandler可以被安裝到同一個ChannelPipeline中。如果一個消息或者任何其他的入站事件被讀取,那么它會從ChannelPipeline的頭部開始流動,并被傳遞給第一個ChannelInboundHandler。這個ChannelHandler不一定會實際地修改數據,具體取決于它的具體功能,在這之后,數據將會被傳遞給鏈中的下一個ChannelInboundHandler。最終,數據會到達ChannelPipeline的尾端,屆時,所有處理就都結束了。

出站數據將會從ChannelOutboundHandler鏈的尾端開始流動,直到它到達鏈的頭部為止。在這之后,出站數據將會到達網絡傳輸層。

通過使用作為參數傳遞到每個方法的ChannelHandlerContext,事件可以被傳遞給當前ChannelPipeLine中的下一個ChannelHandler。因為用戶并不是關心所有的事件,因此Netty提供了抽象類ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter。通過調用ChannelHandlerContext上的對應的方法,都可以簡單地將事件傳遞給下一個ChannelHandler的方法的實現。

當ChannelHandler被添加到ChannelPipeline時,它將會被分配一個ChannelHandlerContext,它代表了Channel和ChannelPipeline之間的綁定。雖然這個對象可以被用于獲取底層的Channel,但是它主要還是被用于出站寫數據。

在Netty中,有兩種發送消息的方式:

直接寫到Channel中,會導致消息從ChannelPipeline的尾端開始流動

寫到和ChannelHandler相關聯的ChannelHandlerContext對象中,會導致消息從ChannelPipeline中的下一個ChannelHandler開始流動

如果將兩個類別(Inboud和Outbound)的ChannelHandler都混合添加到一個ChannelPipeline會發生什么?

雖然ChannelInboundHandler和ChannelOutboundHandler都擴展自ChannelHandler,但是Netty可以區分兩種Handler的實現,并確保數據只會在具有相同定向類型的兩個ChannelHandler之間傳遞。

深入了解ChannelHandler

不同類型的ChannelHandler各自的功能主要取決于它們的超類。Netty以適配器類的形式提供了大量默認的ChannelHandler實現,其旨在簡化應用程序處理邏輯的開發過程。

這些適配器類可以自動將事件轉發到ChannelPipeline中的下一個ChannelHandler,所以你可以只重寫那些你想要特殊處理的方法和事件。

為什么需要適配器?

有一些適配器類可以將編寫自定義的ChannelHanlder所需要的努力降到最低限度,因為它們提供了定義在對應接口中的所有方法的默認實現。
常用的適配器類有:

ChannelHandlerAdapter

ChannelInboundHandlerAdapter

ChannelOutboundHandlerAdapter

ChannelDuplexHandler

編碼解碼器

所有由Netty提供的編碼/解碼適配器類都實現了ChannelOutboundHandler或者ChannelInboundHandler接口。

對于入站數據,channelRead方法已經被重寫了。對于每一個從入站Channel讀取的消息,這個方法都會被調用。隨后,它將調用由預置解碼器提供的decode()方法,并將已解碼的字節轉發給ChannelPipeline中的下一個ChannelHandler,出站相反。

抽象類SimpleChannelInboundHandler

最常見的一個情況,你的應用程序會利用一個ChannelHandler來接受解碼消息,并對該數據應用業務邏輯。要創建一個這樣的ChannelHandler,只需要擴展SimpleChannelInboundHandler,其中是你要處理的消息的Java類型。

在這個ChannelHandler中,你將需要重寫基類的一個或者多個方法,并且獲取一個ChannelHandlerContext的引用,這個引用將作為參數傳遞給ChannelHandler的所有方法。

在這種類型的ChannelHandler中,最重要的方法是channelRead0(ChannelHandlerContext , T)。除了要求不阻塞當前的I/O線程之外,其具體實現完全取決于你。

引導

Netty的引導類為應用程序的網絡層配置提供了容器。

用于客戶端(Bootstrap)引導,將一個進程連接到另一個運行在某個指定主機的指定端口上的進程。

用于服務器(ServerBootstrap)引導,將一個進程綁定到某個指定的端口

Bootstrap類比較

類別 Bootstrap ServerBootstrap
網絡編程中的作用 連接到遠程主機和端口 綁定到一個本地端口
EventLoopGroup的數目 1 2

區別分析:

ServerBootstrap將綁定到一個端口,因為服務器必須要監聽連接,而Bootstrap則是由想要連接到遠程節點的客戶端應用程序所使用的。

為什么服務端需要兩個EventLoopGroup(可以是同一個實例)?因為服務器需要兩組不同的Channel。第一組將只包含一個ServerChannel,代表服務器自身的已綁定到某個本地端口第二次正在監聽的套接字。第二組包含所有已經創建的用來處理傳入客戶端連接(對于每個服務器已經接受的連接都一個)的Channel。

3.與ServerChannel相關聯的EventLoopGroup將分配一個負責為傳入連接請求創建Channel的EventLoop。一旦連接被接受,第二個EventLoopGroup就會給它的Channel分配一個EventLoop。

具有兩個EventLoopGroup的服務器

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69275.html

相關文章

  • 慕課網_《Netty入門之WebSocket初體驗》學習總結

    時間:2018年04月11日星期三 說明:本文部分內容均來自慕課網。@慕課網:https://www.imooc.com 教學源碼:https://github.com/zccodere/s... 學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是Netty 高性能、事件驅動、異步非阻塞的IO Java開源框架 基于NIO的客戶...

    Noodles 評論0 收藏0
  • Spring Boot 2 快速教程:WebFlux 快速入門(二)

    摘要:響應式編程是基于異步和事件驅動的非阻塞程序,只是垂直通過在內啟動少量線程擴展,而不是水平通過集群擴展。三特性常用的生產的特性如下響應式編程模型適用性內嵌容器組件還有對日志消息測試及擴展等支持。 摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝! 02:WebFlux 快速入門實踐 文章工程: JDK...

    gaara 評論0 收藏0
  • Netty入門學習-ByteBuf

    摘要:使用來優化套接字操作,盡可能消除由的緩沖區實現所導致的性能以及內存使用率的懲罰,這種優化發生在的核心代碼中,不會被暴露出來。當前將會被增加所寫入的字節數。 ByteBuf是Java NIO ByteBuffer的替代品,是網絡數據基本單位字節的容器。 ByteBuf的API Netty的數據處理API通過兩個組件暴漏:抽象類ByteBuf和接口ByteBufHolder ByteBuf...

    beanlam 評論0 收藏0
  • Java學習必備書籍推薦終極版!

    摘要:實戰高并發程序設計推薦豆瓣評分書的質量沒的說,推薦大家好好看一下。推薦,豆瓣評分,人評價本書介紹了在編程中條極具實用價值的經驗規則,這些經驗規則涵蓋了大多數開發人員每天所面臨的問題的解決方案。 很早就想把JavaGuide的書單更新一下了,昨晚加今天早上花了幾個時間對之前的書單進行了分類和補充完善。雖是終極版,但一定還有很多不錯的 Java 書籍我沒有添加進去,會繼續完善下去。希望這篇...

    Steve_Wang_ 評論0 收藏0
  • 從Java Socket非阻塞到Netty入門流程

    摘要:事件循環新連接接入連接上的數據讀取抽象連接抽象業務邏輯處理讀寫數據期間的業務層動態鏈處理多個組成,讓消息可以層層處理數據接收基本的數據處理基于公眾號貓說學習交流群現架構設計碼農兼創業技術顧問,不羈平庸,熱愛開源,雜談程序人生與不定期干貨。 本博客 貓叔的博客,轉載請申明出處閱讀本文約 4分鐘 適讀人群:同學 Java IO,Socket非阻塞通信流程 這里我們使用一個內嵌的永久循環,...

    fsmStudy 評論0 收藏0

發表評論

0條評論

qpal

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<