Netty是一个异步的事件驱动网络应用框架。
1. 核心组件
- Channels
Java NIO的一个基础构造。可以认为它就是入站或者出站的一个载体。因此,它可以被打开或者关闭,连接或者断开。 - Callback
也就是回调。这里的回调也就是一个方法,提供给其它方法作为一个参数。Netty在处理时间的时候使用到了callback。当一个callback触发时,相关的事件可以由ChannelHandler接口的实现类处理。代码如下:
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提供了自己的实现-ChannelFuture,用于异步操作。
ChannelFuture提供了额外的方法允许我们注册一个或者多个ChannelFutureListener监听器实例。监听器的callback方法operationComplete()在操作完成时会被调用。
内一个Netty的出站I/O操作都会返回一个ChannelFuture;意味着不会被阻塞。也就是勤勉说的,Netty完完全全就是一个异步事件驱动框架。
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,一旦操作完成就会执行operationComplete
future.addListener(new ChannelFutureListener(){
public void operationComplete(ChannelFuture future){
//检查操作状态
if(future.isSuccess()){
//如果操作成功,创建一个ByteBuf来保存数据
ByteBuf buffer = Unpooled.copiedBuffer(
"Hello",Charset.defaultCharset());
//异步发送数据
ChannelFuture wf = future.channel()
.writeAndFlush(buffer);
....
}else{
Throwable cause = future.cause();
cause.printStackTrace();
}
}
})
- Event 和handler
下图就是入站和出站的事件在ChannelHandlers中流向