Netty-核心组件

Channel

Channel是Java NIO的一个基本构造

它代表一个到实体的开放连接,如读操作或写操作。这里实体指的是,一个硬件设备、一个文件、一个网络套接字或者一个能够执行一个或者多个不同的I/O操作的程序组件。

目前,Channel可以看作是传入(入站)或者传出(出站)数据的载体。因此,它可以被打开或者被关闭,连接或者断开连接。

回调

一个回调就是一个方法,一个指向已经被提供给另外一个方法的方法的引用。这使得接受回调的方法可以在适当的时候调用回调方法。

其实就是函数指针作为参数。

Future

Future提供了一种在操作完成时通知应用程序的方式。这个对象可以看作是一个异步操作的结果的占位符;它将在某个时刻完成,并提供对其访问结果。

Netty提供了自己的future实现——ChannelFuture,用于在执行异步操作的时候使用。每个Netty的出站I/O操作都会返回一个Channel,也就是说,它们都不会阻塞。Netty完全是异步和事件驱动的。

ChannelFuture提供了几种额外的方法,这些方法使得我们可以注册一个或者多个ChannelFutureListener实例。监听器的回调方法operationComplete(),将会在对应的操作完成时被调用。如此一来,便可以消除java并发包Future需要手动检查是否完成带来的繁琐操作。

ChannelFutureListener可以看作是回调的一个更精细的版本;回调和Future是相互补充的机制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Channel channel = ...;
//异步地连接到远程节点 (客户端操作)
ChannelFuture future = channel.connect(new InetSocketAddress("127.0.0.1", 8080));
//注册监听器ChannelFutureListener
//以便在连接操作完成的时候获得通知, 并且执行operation操作
future.addListener(new ChannelFutureListener(){
@Override
public void operationComplete(ChannelFuture future){
if(future.isSuccess()){
ByteBuf byteBuf = Unpooled.copiedBuffer("Cherry", CharsetUtil.UTF_8);
//在连接操作完成以后, 将数据异步地发送到远程节点
ChannelFuture cf = future.channel().writeAndFlush(byteBuf);
}
else{
Throwable cause = future.cause();
cause.getStackTrace();
}
}
});

事件ChannelHandler

Netty使用不同的事件来通知状态的改变或者是操作的状态。

Netty是一个网络编程框架,所以事件是按照它们与入站或者出站数据流的相关性进行分类的。
由入站数据或者相关的状态更改而触发的事件,包括:

  • 连接已被激活或者连接失活;
  • 数据读取;
  • 用户事件;
  • 错误事件。

由出站事件是未来将会触发的某个动作的操作结果,包括

  • 打开或者关闭到远程节点的连接;
  • 将数据写或者冲刷到套接字。