Java Netty核心模塊超詳細(xì)梳理
Bootstrap與ServerBootstrap
Bootstrap意思是引導(dǎo),一個Netty應(yīng)用通道由一個Bootstrap開始,主要作用是配置整個Netty程序,串聯(lián)各個組件,Netty中Bootstrap類是服務(wù)端啟動引導(dǎo)類常用的方法有
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) 用于服務(wù)器端,設(shè)置兩個EventLoop
public B group(EventLoopGroup group) 用于客戶端,設(shè)置一個EventLoop public B channel(Class<? extends C> channelClass) 設(shè)置一個Netty程序的通道實(shí)現(xiàn) public B option(ChannelOption option, T value) 給ServerChannel添加配置 public ServerBootstrap childOption(ChannelOption childOption, T value) 給接收的通道添加配置 public ServerBootstrap childHandler(ChannelHandler childHandler) 設(shè)置業(yè)務(wù)處理類(自定義的Handler) public ChannelFuture bind(int inetPort) 用于服務(wù)器端,設(shè)置綁定的端口號 public ChannelFuture connect(String inetHost, int inetPort) 用于客戶端,用來連接服務(wù)器
Future與ChannelFuture
Netty中所有的IO操作都是異步的,不能立刻得知是否被正確處理。但可以給Future和ChannelFuture注冊一個監(jiān)聽,當(dāng)操作執(zhí)行成功或失敗時(shí),會自動觸發(fā)監(jiān)聽事件
常用的方法有
- Channel channel() 返回當(dāng)前正在進(jìn)行IO操作的通道
- ChannelFuture sync() 等待異步操作執(zhí)行完畢
Channel
Netty網(wǎng)絡(luò)通訊組件,能夠用于執(zhí)行網(wǎng)絡(luò)IO操作
通過Channel可獲得當(dāng)前網(wǎng)絡(luò)的通道的狀態(tài)
通過Channel可獲得網(wǎng)絡(luò)連接的配置參數(shù)
Channel提供異步的網(wǎng)絡(luò)IO操作(如建立連接,讀寫,綁定端口)
任何調(diào)用返回一個ChannelFuture實(shí)例,通過注冊監(jiān)聽到ChannelFuture上,在IO操作完成時(shí)回調(diào)通知調(diào)用方
支持關(guān)聯(lián)IO操作與對應(yīng)的處理程序
不同協(xié)議、不同的阻塞類型的都有不同的Channel類型與之對應(yīng),常用的Channel類型:
- NioSocketChannel,異步的客戶端TCP Socket連接
- NioServerSocketChannel,異步的服務(wù)端TCP Socket連接
- NioDatagramChannel,異步的UDP連接
- NioSctpChannel,異步的客戶端Sctp連接
- NioSctpServerChannel,異步的Sctp服務(wù)器端連接,這些通道涵蓋了UDP和TCP網(wǎng)絡(luò)IO以及文件IO
Selector
Netty基于Selector對象實(shí)現(xiàn)IO多路復(fù)用,通過Selector一個線程可以監(jiān)聽多個連接的Channel事件
當(dāng)向一個Selector中注冊Channel后,Selector內(nèi)部會輪詢這些Channel是否有已就緒的IO事件(如可讀、可寫、網(wǎng)絡(luò)連接完成等),這樣程序就可以很簡單地使用一個線程高效管理多個Channel
ChannelHandler及其實(shí)現(xiàn)類
ChannelHandler是一個接口,處理IO事件或攔截IO操作,并將其轉(zhuǎn)發(fā)到其ChannelPipeline中的下一個處理程序
ChannelHandler本身并沒有提供很多方法,使用時(shí)可繼承它的子類
ChannelHandler及其實(shí)現(xiàn)類
- ChannelInboundHandler 用于處理入站IO事件
- ChannelOutboundHandler 用于處理出站IO事件
實(shí)際使用中,經(jīng)常需要自定義Handler類繼承ChannelInboundHandlerAdapter,然后重寫相關(guān)方法實(shí)現(xiàn)業(yè)務(wù)邏輯
public void channelActive(ChannelHandlerContext ctx) 通道就緒事件
public void channelInactive(ChannelHandlerContext ctx) 通道關(guān)閉事件
public void channelRead(ChannelHandlerContext ctx, Object msg) 讀取數(shù)據(jù)事件
public void channelReadComplete(ChannelHandlerContext ctx) 數(shù)據(jù)讀取完畢事件
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 拋出異常事件
Pipeline和ChannelPipeline
ChannelPipeline是一個重點(diǎn):
ChannelPipeline是一個Handler的集合,負(fù)責(zé)處理inbound或outbound事件,相當(dāng)于一個貫穿Netty的職責(zé)鏈
ChannlePipeline實(shí)現(xiàn)了一種高級形式的攔截過濾器模式,使用戶可以完全控制事件的處理方式,以及Channel中各個ChannelHandler如何相互交互
在Netty中每個Channel都有且僅有一個ChannelPipeline與之對應(yīng),它們的組成關(guān)系如下
一個Channel包含了一個ChannelPipeline,而ChannelPipeline中又維護(hù)了一個由ChannelHandlerContext組成的雙向鏈表,并且每個ChannelHandlerContext中又關(guān)聯(lián)著一個ChannelHander
入站事件和出站事件在一個雙向鏈表中,入站事件會從鏈表head往后傳遞到最后一個入站的handler,出站事件會從鏈表tail往前傳遞到最前一個出站的handler,兩種類型的handler互不干擾
常用方法
ChannelPipeline addLast(ChannelHandler… handlers); 把一個業(yè)務(wù)處理類(handler)添加到鏈表的第一個位置
ChannelPipeline addFirst(ChannelHandler… handlers); 把一個業(yè)務(wù)處理類(handler)添加到鏈表的最后一個位置
ChannelHandlerContext
保存Channel相關(guān)的所有上下文信息,同時(shí)關(guān)聯(lián)一個ChannelHandler對象
ChannelHandlerContext中包含一個具體的事件處理器ChannelHandler,同時(shí)也綁定了對應(yīng)的pipeline和Channel,方便對ChannelHandler進(jìn)行調(diào)用
常用方法
ChannelFuture close(); 關(guān)閉當(dāng)前通道
ChannelHandlerContext flush(); 刷新數(shù)據(jù)
ChannelFuture writeAndFlush(Object msg); 將數(shù)據(jù)寫到ChannelPipeline中,并開始出站處理
ChannelOption
Netty在創(chuàng)建Channel實(shí)例后,一般都需要設(shè)置ChannelOption參數(shù)
ChannelOption參數(shù)如下:
ChannelOption.SO_BACKLOG 對應(yīng)TCP/IP協(xié)議listen函數(shù)中的backlog參數(shù),用來初始化服務(wù)器可用隊(duì)列大小。服務(wù)端處理客戶端連接請求是順序處理的
ChannelOption.SO_KEEPALIVE 保持連接活動狀態(tài)
EventLoopGroup和其實(shí)現(xiàn)類NioEventLoopGroup
EventLoopGroup是一組EventLoop的抽象,Netty為了更好的利用多核CPU資源,一般會有多個EventLoop同時(shí)工作,每個EventLoop維護(hù)著一個Selector實(shí)例
EventLoopGroup提供next接口,可以從組里面按照一定的規(guī)則獲取其中一個EventLoop來處理任務(wù)
常用方法
public NioEventLoopGroup(int nThreads),構(gòu)造函數(shù),可以指定線程數(shù),如果沒有指定就是CPU核心數(shù)的兩倍
public Future<?> shutdownGracefully() 斷開連接,關(guān)閉線程
Unpooled
Netty提供一個專門用來操作緩沖區(qū)(Netty數(shù)據(jù)容器)的工具類
常用方法:
public static ByteBuf copiedBuffer(CharSequence string, Charset charset)
public class NettyByteBufTest { public static void main(String[] args) { // 創(chuàng)建一個包含數(shù)組byte[10]的ByteBuf對象 // Netty的ByteBuf不需要使用filp進(jìn)行反轉(zhuǎn),底層維護(hù)了readInder和writeIndex ByteBuf buffer = Unpooled.buffer(10); for (int i = 0; i < 10; i++) { buffer.writeByte(i); } System.out.println("capacity=" + buffer.capacity()); //輸出 for (int i = 0; i < buffer.capacity(); i++) { System.out.println(buffer.readByte()); } } }
到此這篇關(guān)于Java Netty核心模塊超詳細(xì)梳理的文章就介紹到這了,更多相關(guān)Java Netty內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java消息隊(duì)列-Spring整合ActiveMq
本篇文章主要介紹了詳解Java消息隊(duì)列-Spring整合ActiveMq ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02使用.NET Core3.0創(chuàng)建一個Windows服務(wù)的方法
這篇文章主要介紹了使用.NET Core3.0創(chuàng)建一個Windows服務(wù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04Spring實(shí)戰(zhàn)之依賴關(guān)系注入之后的行為示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之依賴關(guān)系注入之后的行為,結(jié)合實(shí)例形式分析了Spring依賴關(guān)系注入之后的行為實(shí)現(xiàn)與使用相關(guān)操作技巧,需要的朋友可以參考下2019-11-11Java正則表達(dá)式Pattern和Matcher原理詳解
這篇文章主要介紹了Java正則表達(dá)式Pattern和Matcher原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02Maven導(dǎo)入依賴時(shí)報(bào)錯如何解決
這篇文章主要介紹了Maven導(dǎo)入依賴時(shí)報(bào)錯如何解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12