Netty是一個異步的事件驅(qū)動網(wǎng)絡應用框架枯跑。
1. 核心組件
- Channels
Java NIO的一個基礎構造“兹龋可以認為它就是入站或者出站的一個載體敛助。因此,它可以被打開或者關閉屋确,連接或者斷開纳击。 - Callback
也就是回調(diào)。這里的回調(diào)也就是一個方法攻臀,提供給其它方法作為一個參數(shù)焕数。Netty在處理時間的時候使用到了callback。當一個callback觸發(fā)時刨啸,相關的事件可以由ChannelHandler接口的實現(xiàn)類處理堡赔。代碼如下:
public class ConnectHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(ChannelHandlerContext ctx)
throws Exception {
System.out.println(
"Client " + ctx.channel().remoteAddress() + " connected");
}
}
- Future
Future提供了另外一種操作完成時通知應用的方式。Jdk提供的future只能允許你手動檢查操作是否完成或者一直阻塞直到操作完成设联。所以Netty提供了自己的實現(xiàn)-ChannelFuture善已,用于異步操作。
ChannelFuture提供了額外的方法允許我們注冊一個或者多個ChannelFutureListener監(jiān)聽器實例离例。監(jiān)聽器的callback方法operationComplete()在操作完成時會被調(diào)用换团。
內(nèi)一個Netty的出站I/O操作都會返回一個ChannelFuture;意味著不會被阻塞。也就是勤勉說的宫蛆,Netty完完全全就是一個異步事件驅(qū)動框架艘包。
Channel channel = ...;
//非阻塞
//異步連接
ChannelFuture future = channel.connect(
new InetSocketAddress("192.168.0.1",25));
Channel channel = ...;
//非阻塞
//異步連接
ChannelFuture future = channel.connect(
new InetSocketAddress("192.168.0.1",25));
//注冊一個ChannelFutureListener,一旦操作完成就會執(zhí)行operationComplete
future.addListener(new ChannelFutureListener(){
public void operationComplete(ChannelFuture future){
//檢查操作狀態(tài)
if(future.isSuccess()){
//如果操作成功耀盗,創(chuàng)建一個ByteBuf來保存數(shù)據(jù)
ByteBuf buffer = Unpooled.copiedBuffer(
"Hello",Charset.defaultCharset());
//異步發(fā)送數(shù)據(jù)
ChannelFuture wf = future.channel()
.writeAndFlush(buffer);
....
}else{
Throwable cause = future.cause();
cause.printStackTrace();
}
}
})
- Event 和handler
下圖就是入站和出站的事件在ChannelHandlers中流向