使用Springboot整合開發Netty(一個表白的小案例)

情感導師 6550

 添加導師LINE:jaqg

獲取更多愛情挽回攻略 婚姻修復技巧 戀愛脫單幹貨

寫了很久的java並發包裡面的文章,今天換一個口味。很早之前學的Netty,由於最近項目經常使用到,遇到了很多坑,因此想通過一個體系教程說一下這個高性能異步通信框架Netty,這也是netty的第一篇文章。主要是通過Springboot來整合Netty實現一個最基本的案例。

一、Netty是什麼

想認識Netty最好的方式就是直接去官網看文檔,由於文檔是英文,因此直接在這裡翻譯過來了。

Netty是一個高性能、異步事件驅動的NIO框架,支持如TCP、UDP協議和傳輸文件。「高性能」並不意味着程序會出現各種性能或其他問題。它是一種精心設計的框架,其靈活性、穩定性依然能夠得到保證。

使用Springboot整合開發Netty(一個表白的小案例)

官網說這個Netty特別好,畢竟是自家的產品,不過好不好還是用戶說了才可以,通過實踐證明,目前Netty是我們業界最流行的NIO框架,無數個商業項目也已經驗證了。畢竟java的NIO框架開發起來太噁心,而且還有各種bug沒有解決。

為什麼我們要首選Netty呢?之前看的書列舉了很多條,不過最根本的我覺得還是這幾個:使用簡單、功能強大、性能高、開發無煩惱。無煩惱是因為bug較少,而且也比較成熟。

相信你看這篇文章,可能是項目中要用到,也可能只是想學習一個新技能。不管是出於什麼目的,通過上面的分析,你就會發現這個Netty真的是很有必要了解學習。下面我們就直接上手寫個最基本的案例吧。

二、案例實現

這個是一個客戶端服務端簡單通信的案例,假設服務端是個女孩,客戶端男孩向其表白。

男孩:I love you女孩:no男孩:不灰心不喪氣,繼續愛你

1、前提準備

如果你是Springboot直接在maven中添加依賴即可

如果你沒有使用maven那麼直接去官網或者是百度下載一個netty-all-5.0.0.Alpha1的jar包導入即可。

2、服務端(女孩)開發

我們直接看代碼,再來分析其流程。

基本流程最好對照着代碼來看,這樣理解的會更加深刻。

(1)new了兩個NioEventLoopGroup,一個是boss,一個是work。NioEventLoopGroup是一個線程組,boss線程組用於接收客戶端的連接工作,work線程組用於處理數據。

(2)在start方法中,首先new了一個ServerBootstrap,,名字叫bootstrap。它是netty用於啟動NIO服務端的輔助啟動類。目的是降低服務端的開發複雜度。

(3).group(boss, work)目的是將兩個線程組傳入,讓其工作。

(4).channel(NioServerSocketChannel.class)就類比與NIO中的ServerSocketChannel。

(5).option(ChannelOption.SO_BACKLOG, 1024)配置TCP參數,將其中一個參數backlog設置為1024,表明臨時存放已完成三次握手的請求的隊列的最大長度。

(6).childOption(ChannelOption.SO_KEEPALIVE, true)設置TCP長連接,一般如果兩個小時內沒有數據的通信時,TCP會自動發送一個活動探測數據報文。

(7).handler(new LoggingHandler(LogLevel.INFO))處理Log日誌。

(8).childHandler,用於處理客戶端的IO事件,比如有一個客戶端發起請求,要讀取數據,就可以使用這裡面的類來處理這個事件。這是整個處理的核心。也是我們自己主要關注的類。

(9)ChannelFuture cf = bootstrap.bind(8888).sync();綁定監聽端口。使用sync方法阻塞一直到綁定成功。

(10)下面通過一個if語句表明,如果綁定成功那就輸出「服務端啟動成功」。

(11)最後將boss和work使用finally代碼塊優雅的退出。何為優雅今後再說。

其實上面的這些代碼都是固定模式的,也就是說你使用的時候直接就可以用了,最核心的就是如何處理客戶端的各種事件,比如說有客戶端連接、讀、寫數據等等相關事件。看看ServerUAVHandler類是如何實現的,

基本流程如下:

(1)ServerUAVHandler繼承了ChannelHandlerAdapter主要是用於處理網絡的讀寫事件。

(2)重寫了channelRead讀方法,在這個方法內部可以讀取客戶端的請求信息。其中一個參數msg就是封裝的信息對象。我們可以在內部通過ByteBuf這個工具類進行讀取。內部實現的細節就不再多描述了。

3、客戶端(男孩)開發

從上面的代碼我們會發現,和服務器端的類似,我們在這裡主要關注於和服務器有什麼不一樣,可能是年齡越來越大,你在對比的時候一定要返回去看看,不僅可以加深印象,還可能突然就恍然大悟了。

(1)首先,只new了一個NioEventLoopGroup,因為不需要處理連接,所以客戶端只關注於讀寫數據的操作。

(2)在start方法內部創建了一個Bootstrap,名字是b,意思是客戶端的啟動類。

(3)接着使用option配置一些參數。

(4)使用handler方法傳遞一個類,在內部有一個ClientHandler類,同樣也是客戶端的核心。

(5)接下來鏈接服務器,指定地址和端口。最終關閉鏈接優雅的推出線程組。

上面的代碼都是模板代碼,你可以直接拿來用,在後期越來越深入的時候再來修改。在這裡我們還是主要關注一下這個ClientHandler類吧。

在這裡客戶端,首先給服務端發送一個消息「I Love you 」。然後如果收到的是no回復,再說一次「不灰心不喪氣,繼續我愛你」。這裡重寫了兩個方法channelActive和channelRead方法,第一個是連接到服務端的時候調用,一個是讀取服務端的信息調用。

三、總結

通過以上的分析,不知道你能否體會到Netty帶來的方便,其實NettyServer類和NettyClient都是模板類,我們只需要關注於這個handler處理類即可,而且相關的處理方法,我們可以直接通過重寫就可以實現。再回想一下NIO編程客戶端和服務端通信的時候,代碼寫的都想XX。

OK,今天的文章就先說到這裡吧,對了學習最好的方式就是動手敲一遍,有時候看着很簡單,但是真實的操作一遍就會遇見很多坑。

評論列表

頭像
2024-01-07 16:01:38

給出的方案很有意義很實用,對我的幫助很大!

頭像
2024-01-01 19:01:22

求助

 添加導師LINE:jaqg

獲取更多愛情挽回攻略 婚姻修復技巧 戀愛脫單幹貨

發表評論 (已有2條評論)