Bootsrap、ServerBootstrap
1匿沛、Bootsrap意思是引導(dǎo),一個Netty應(yīng)用通常由一個Bootsrap開始,主要作用是配置整個Netty程序,串聯(lián)各個組件,Netty中Bootstrap類是客戶端程序的啟動引導(dǎo)類,ServerBootstrap是服務(wù)器端啟動引導(dǎo)類。
2榛鼎、常見的方法有
- public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup),該方法用于服務(wù)器端,用來設(shè)置兩個EventLoop
- public B group(EventLoopGroup group),該方法用于客戶端,用來設(shè)置一個EventLoopGroup
- public B channel(Class<? extends C> channelClass),該方法用來設(shè)置一個服務(wù)器端的通道實現(xiàn)
- public <T> B option(ChannelOption<T> option, T value),用來給ServerChannel添加配置
- public <T> ServerBootstrap childOption(ChannelOption<T> 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
1、Netty中所有的IO操作都是異步的,不能like得知消息是否被正確處理借帘。但是可以過一會等它執(zhí)行完成或者注冊一個監(jiān)聽,具體的實現(xiàn)就是通過Future和ChannelFutures,它們可以注冊一個監(jiān)聽,當(dāng)操作執(zhí)行成功或失敗時監(jiān)聽會自動觸發(fā)注冊的監(jiān)聽事件蜘渣。
2、常見的方法有
- Channel channel(),返回當(dāng)前正在進行IO操作的通道
- ChannelFuture sync,等待異步操作執(zhí)行完畢
Channel
1肺然、Netty網(wǎng)絡(luò)通信的組件,能夠用于執(zhí)行網(wǎng)絡(luò)I/O操作
2、通過Channel可獲得當(dāng)前網(wǎng)絡(luò)連接的通道的狀態(tài)
3腿准、通過Channel可獲得網(wǎng)絡(luò)連接的配置參數(shù)(例如接收緩沖區(qū)大小)
4际起、Channel提供異步的網(wǎng)絡(luò)I/O操作(如建立連接,讀寫,綁定端口),異步調(diào)用意味著任何I/O調(diào)用都將立即返回,并且不找正在調(diào)用結(jié)束時鎖請求的I/O操作已完成
5、調(diào)用立即返回一個ChannelFuture實例,通過注冊監(jiān)聽器到ChannelFuture上,可以I/O操作成功吐葱、失敗或取消時回調(diào)通知調(diào)用方
6街望、支持關(guān)聯(lián)I/O操作與對應(yīng)的處理程序
7、不同協(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
1、Netty基于Selector對象實現(xiàn)I/O多路復(fù)用,通過Selector一個線程可以監(jiān)聽多個連接的Channel事件炭玫。
2奈嘿、當(dāng)向一個Selector中注冊Channel后,Selector內(nèi)部的機制就可以自動不斷地查詢(Select)這些注冊的Channel是否有已就緒的I/O事件(例如可讀,可寫,網(wǎng)絡(luò)連接完成等),這樣程序就可以很簡單地使用一個線程高效地管理多個Channel
ChannelHandler及其實現(xiàn)類
1、ChannelHandler是一個接口,處理I/O事件或攔截I/O操作,并將其轉(zhuǎn)發(fā)到其ChannelPipeline(業(yè)務(wù)處理鏈)中的下一個處理程序吞加。
2裙犹、ChannelHandler本身并沒有提供很多方法,因為這個接口有許多的方法需要實現(xiàn),方便使用期間,可以繼承它的子類。
3衔憨、ChannelHandler及其實現(xiàn)類一覽
ChannelInboundHandler 用于處理入站 I/O 事件叶圃。
ChannelOutboundHandler 用于處理出站 I/O 操作。
//適配器
ChannelInboundHandlerAdapter 用于處理入站 I/O 事件践图。
ChannelOutboundHandlerAdapter 用于處理出站 I/O 操作盗似。
ChannelDuplexHandler 用于處理入站和出站事件。
4平项、我們經(jīng)常需要自定義一個Handler類去繼承ChannelInboundHandlerAdapter,然后通過重寫相應(yīng)方法實現(xiàn)業(yè)務(wù)邏輯
public class ChannelInboundHandlerAdapter extends ChannelHandlerAdapter implements ChannelInboundHandler {
public ChannelInboundHandlerAdapter() {
}
public void channelRegistered(ChannelHandlerContext ctx) throws Exception
{
ctx.fireChannelRegistered();
}
public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
ctx.fireChannelUnregistered();
}
//通道就緒事件
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.fireChannelActive();
}
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
ctx.fireChannelInactive();
}
//通道讀取數(shù)據(jù)事件
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ctx.fireChannelRead(msg);
}
//數(shù)據(jù)讀取完畢事件
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.fireChannelReadComplete();
}
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
ctx.fireUserEventTriggered(evt);
}
public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception {
ctx.fireChannelWritabilityChanged();
}
//通道發(fā)生異常事件
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
ctx.fireExceptionCaught(cause);
}
}