91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Netty編寫一個服務端程序

發布時間:2021-06-26 13:48:31 來源:億速云 閱讀:153 作者:chen 欄目:web開發

本篇內容主要講解“怎么用Netty編寫一個服務端程序”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用Netty編寫一個服務端程序”吧!

1.編寫一個Server端Demo

1.1 基于主從Reactor模式的Demo實現

如果從來沒用過Netty,那么了解一下用Netty編寫的Server端Demo是必不可少的。

還記得我們上一篇說的 “主從Reactor模式” 嗎?可以構建兩個 Reactor,主 Reactor 單獨監聽server  socket,accept新連接,然后將建立的 SocketChannel 注冊給指定的從  Reactor,從Reactor再執行事件的讀寫、分發,把業務處理就扔給worker線程池完成。

怎么用Netty編寫一個服務端程序

我們就按照這個模式,用Netty編寫一個服務端程序吧。

直接上代碼!

一個簡單的自定義ChannelHandler類,用來自定義業務處理邏輯:

怎么用Netty編寫一個服務端程序

一個包含Bootstrap的服務端啟動類:

public class EchoServer {     private int port;      public EchoServer(int port) {         this.port = port;     }      public static void main(String[] args) throws Exception {         new EchoServer(8833).start();     }      public void start() throws Exception {         //1.Reactor模型的主、從多線程         EventLoopGroup mainGroup = new NioEventLoopGroup();         EventLoopGroup childGroup = new NioEventLoopGroup();          try {             //2.構造引導器實例ServerBootstrap             ServerBootstrap b = new ServerBootstrap();             b.group(mainGroup, childGroup)                     .channel(NioServerSocketChannel.class) //2.1 設置NIO的channel                     .localAddress(new InetSocketAddress(port)) //2.2 配置本地監聽端口                     .childHandler(new ChannelInitializer<SocketChannel>() { //2.3 初始化channel的時候,配置Handler                         @Override                         protected void initChannel(final SocketChannel socketChannel) {                             socketChannel.pipeline()                                     .addLast("codec", new HttpServerCodec())                                     .addLast("compressor", new HttpContentCompressor())                                     .addLast("aggregator", new HttpObjectAggregator(65536))                                     .addLast("handler", new EchoServerHandler()); //2.4 加入自定義業務邏輯ChannelHandler                         }                     });             ChannelFuture f = b.bind().sync(); //3.啟動監聽             System.out.println("Http Server started, Listening on " + port);             f.channel().closeFuture().sync();         } finally {             mainGroup.shutdownGracefully().sync();             childGroup.shutdownGracefully().sync();         }     } }

啟動后,通過curl調用,得到響應。

怎么用Netty編寫一個服務端程序

Demo完成了!

對于之前覺得用Java NIO包實現起來很復雜的的 “主從Reactor模式” ,用Netty簡簡單單就完成了。

怎么用Netty編寫一個服務端程序

只需要創建兩個EventLoopGroup,然后綁定到引導器ServerBootstrap上就好了.

mainGroup 是主 Reactor,childGroup 是從 Reactor。它們分別使用不同的 NioEventLoopGroup,主  Reactor 負責處理 Accept,然后把 Channel 注冊到從 Reactor 上,從 Reactor 主要負責 Channel 生命周期內的所有  I/O 事件。

1.2 Demo分析

從上面的Demo代碼可以看出,對于所有用Netty編寫的服務端程序,至少需要兩個部分:

  • 至少一個ChannelHandler

  • Bootstrapping

1)ChannelHandler

這個組件用來實現對客戶端發送過來的數據進行處理,可能包括編解碼、自定義業務邏輯處理等等。

對于ChannelHandler來說,有非常多的實現。在Demo中我們簡單使用了幾個Netty自帶的Handler,包括HttpServerCodec、HttpContentCompressor、HttpObjectAggregator,也使用了一個自定義的EchoServerHandler。

可以看到,對于Handler的使用,是非常重要也是非常方便的一個環節。我們會在以后的文章中詳細展開。

2)Bootstrapping

啟動代碼部分。用來配置服務端的啟動參數,包括監聽端口、服務端線程池配置、網絡連接屬性配置、ChannelHandler配置等等。

結合Demo來看,主要分為這幾個步驟:

  • 創建一個ServerBootstrap實例,用來引導啟動。

  • 創建一個(當我們使用主從Reactor模式時,需要創建兩個)NioEventLoopGroup實例來處理事件,  比如接受一個新的客戶端連接、讀寫數據等。

  • 指定一個端口,用來作為服務端的監聽端口。

  • 使用一系列channelHandler來初始化每個Channel,包括自定義業務邏輯實現的channelHandler。

  • 調用ServerBootstrap.bind() 來真正觸發啟動。

2. Netty的邏輯架構

通過上面的Demo演示,我們對 Netty 的使用已經有了一個大概的印象。

下面,我們根據Demo中使用的幾個組件,一起梳理一下 Netty 的邏輯架構。

怎么用Netty編寫一個服務端程序

結合我們的Demo和這個邏輯架構圖,我們梳理下各個組件的流轉過程:

  • 服務端利用ServerBootstrap進行啟動引導,綁定監聽端口

  • 啟動初始化時有 main EventLoopGroup 和 child EventLoopGroup 兩個組件,其中 main  EventLoopGroup負責監聽網絡連接事件。當有新的網絡連接時,就將 Channel 注冊到 child EventLoopGroup。

  • child EventLoopGroup 會被分配一個 EventLoop 負責處理該 Channel 的讀寫事件。

  • 當客戶端發起 I/O 讀寫事件時,服務端 EventLoop 會進行數據的讀取,然后通過 ChannelPipeline  依次有序觸發各種ChannelHandler進行數據處理。

  • 客戶端數據會被依次傳遞到 ChannelPipeline 的 ChannelInboundHandler  中,在一個handler中處理完后就會傳入下一個handler。

  • 當數據寫回客戶端時,會將處理結果依次傳遞到 ChannelPipeline 的 ChannelOutboundHandler  中,在一個handler中處理完后就會傳入下一個handler,最后返回客戶端。

以上便是 Netty 各個組件的邏輯架構,我們暫時只需要了解個大致框架即可,后面我們會詳細介紹各個組件。

有幾個比較常見的問題在這里總結下:

1)什么是Channel

Channel 的字面意思是“通道”,它是網絡通信的載體,提供了基本的 API 用于網絡 I/O 操作,如  register、bind、connect、read、write、flush 等。

Netty 實現的 Channel 是以 JDK NIO Channel 為基礎的,提供了更高層次的抽象,屏蔽了底層 Socket。

2)什么是ChannleHandler和ChannelPipeline

ChannelHandler實現對客戶端發送過來的數據進行處理,可能包括編解碼、自定義業務邏輯處理等等。

ChannelPipeline 負責組裝各種 ChannelHandler,當 I/O 讀寫事件觸發時,ChannelPipeline 會依次調用  ChannelHandler 列表對 Channel 的數據進行攔截和處理。

3)什么是EventLoopGroup?

EventLoopGroup 本質是一個線程池, 是 Netty Reactor 線程模型的具體實現方式,主要負責接收 I/O  請求,并分配線程執行處理請求。我們在demo中使用了它的實現類 NioEventLoopGroup,也是 Netty 中最被推薦使用的線程模型。

我們還通過構建main EventLoopGroup 和 child EventLoopGroup 實現了 “主從Reactor模式”。

4)EventLoopGroup、EventLoop、Channel有什么關系?

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

EventLoop 用于處理 Channel 生命周期內的所有 I/O 事件,如 accept、connect、read、write 等 I/O  事件。

EventLoop 同一時間會與一個線程綁定,每個 EventLoop 負責處理多個 Channel。

到此,相信大家對“怎么用Netty編寫一個服務端程序”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肥西县| 康定县| 丁青县| 乐都县| 鸡西市| 新竹市| 贺兰县| 清苑县| 北流市| 建湖县| 广南县| 土默特右旗| 株洲县| 搜索| 余江县| 大名县| 潮安县| 固原市| 友谊县| 社会| 阜平县| 青田县| 石首市| 贵港市| 防城港市| 班玛县| 西丰县| 石柱| 同仁县| 临澧县| 平江县| 松江区| 日土县| 濮阳县| 阿克| 合江县| 四子王旗| 霍林郭勒市| 梓潼县| 集贤县| 鹤山市|