本文是我学习《Netty实战》的一些笔记。
Netty 的核心组件:
- Channel
- 回调
- Future
- 事件和ChannelHandler
一、 Channel
Channel 是 java NIO的一个基本构造。可以把Channel看做是传入或者传出数据的载体。它可以被打开或者关闭,连接或者断开连接。
二、回调
一个回调就是一个方法,一个指向已经被提供给另外一个方法的方法的引用,使得后者可以再适当的时候调用前者。Netty内部使用了回调来处理事件,当一个回调被触发时候,相关的事件可以被一个interfaceChannelHandler的实现处理。
比如,当一个新的连接被建立,ChannelHandler的channelActive()回调方法将会被调用。
public class EchoServerHandler extends ChannelHandlerAdapter{
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.write("连接建立!");
}
}
三、Future
Future提供了另一种在操作完成时通知应用程序的方式。Netty提供了ChannelFuture,用于在执行异步操作的时候使用。ChannelFuture提供了方法可以注册一个或多个ChannelFutureListener实例。listener的回调方法operationComplete()将会在对应的操作完成时被调用。
四、事件和ChannelHandler
Netty 使用不同的事件来通知我们状态的改变或者是操作的状态。我们可以基于已经发生的事件来触发适当的动作。Netty的事件按照它们与入站或出站数据流的相关性进行分类。
入站:
- 连接已被激活或者连接失活
- 数据读取
- 用户事件
- 错误事件
出站:
- 打开或者关闭到远程节点的连接
- 将数据写到或者冲刷到socket
每个事件都可被分发给ChannelHandler类中的某个用户实现的方法。
五、EventLoop
Netty通过触发事件讲Selector从应用程序中抽象出来。在内部,为每个Channel分配一个EventLoop,用以处理所有事件,包括:
- 注册感兴趣的事件
- ==将事件派发给ChannelHandler==
- 安排进一步的动作
EventLoop 本身由一个线程驱动,处理了一个Channel的所有I/O事件,并且在该EventLoop的整个生命周期内都不会改变。