Netty架构
Netty主要由三大块组成:
- 核心组件
- 传输服务
- 协议
核心组件
包括事件模型、字节缓冲区、通信API
- 事件模型
入站事件、出站事件 - 字节缓冲区
Bytebuf - 通信API
通信API都被抽象到Channel中
传输服务
- NIO
io.netty.channel.socket.nio包用于支持NIO,具体实现使用java.nio.channels包作为基础 - Epoll
io.netty.channel.epoll包用于支持JNI驱动的epoll和非阻塞IO,epoll传输只在linux上获得支持 - OIO
io.netty.channel.socket.oio包用于支持使用java.net包作为基础的阻塞IO - 本地
io.netty.channel.local用于支持在VM内部通过管道进行通信的本地传输 - 内嵌
io.netty.channel.embedded包用作内嵌传输,允许使用ChannelHandler而又不需要一个真正的基于网络的传输
netty主要构件块:
- Channel
- 回调
- Future
- 事件和ChannelHandler
Channel
传入或传出数据的载体,可以被打开或者关闭,连接或者断开连接
回调
一个回调其实就是一个方法,一个指向已经被提供给另外一方法的方法的引用。使得后者可以在适当的时候调用前者。
Netty内部使用了回调来处理事件,当一个回调被触发时,相关的事件可以被一个interface–ChannelHandler的实现处理。当一个新的连接已经被建立时,ChannelHandler的channelActive回调方法将会被调用。
Future
Future提供了另一种在操作完成时通知应用程序的方式。这个对象可以看做是一个异步操作的结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问。
- 异步的连接远程节点
ChannelFuture Future= channel.connect(new InetSocketAddress("localhost",888));
connect方法将会直接返回,而不会阻塞。线程不用阻塞以等待对应的操作完成,多以可以同时做其他工作,从而更加有效的利用资源。
- 注册一个ChannelFutureListener
future.addListener(new ChannelFutureListener(){
@Override
public void operationComplete(ChannelFuture future){
if(future.isSuccess()){
ByteBuf buffer = Unpooled.copiedBuffer("Hello",Charset.defaultCharset());
ChannelFuture ff = future.channel().writeAndFlush(buffer);
}else{
Throwable cause = future.cause();
cause.printStackTrace();
}
}
})
事件和ChannelHandler
Netty使用不同的事件来通知我们状态的改变或是操作的状态。