一、什么是Netty
在网络编程领域,Netty是Java的卓越框架。它驾驭了Java高级API的能力,并将其隐藏在一个易于使用的API之后。Netty使你可以专注于自己真正的业务。简单的说,Netty是一个让网络编程变得简洁的框架,实现了真正的异步非阻塞,性能及其优越。
二、为什么选择Netty
通常,如果用NIO来实现一个服务端需要以下步骤。
- 创建ServerSocketChannel,配置它为非阻塞模式;
- 绑定监听,配置TCP参数,例如backlog大小;
- 创建一个独立的I/O线程,用于轮询多路复用器Selector;
- 创建Selector,将之前创建的ServerSocketChannel注册到Selector上,监听SelectionKey.ACCEPT;
- 启动I/O线程,在循环体中执行Selector.select()方法,轮询就绪的Channel;
- 当轮询到了处于就绪Channel时,需要对其进行判断,如果是OP_ACCEPT状态,说明是新的客户端接入,则调用ServerSocketChannel.accept()方法接受新的客户端;
- 设置新接入的客户端链路SocketChannel为非阻塞模式,配置其他的一些TCP参数;
- 将SocketChannel注册到Selector,监听OP_READ操作位;
- 如果轮询的Channel为OP_READ,则说明SocketChannel中有新的就绪的数据包需要读取,则构造ByteBuffer对象,读取数据包;
- 如果轮询的Channel为OP_WRITE,说明还有数据没有发送完成,需要继续发送。
一个简单的NIO服务端程序,如果我们直接使用JDK的NIO类库进行开发,竟然需要经过烦琐的十多步操作才能完成最基本的消息读取和发送,这也是我们要选择Netty等NIO框架的原因了。
2.1 Netty的优点
- API使用简单,开发门槛低;
- 功能强大,预置了多种编解码功能,支持多种主流协议;
- 定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展;
- 性能高,通过与其他业界主流的NIO框架对比,Netty的综合性能最优;
- 成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼;
- 社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会加入;
- 经历了大规模的商业应用考验,质量得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它已经完全能够满足不同行业的商业应用了。
三、Netty的核心组件
Channel、Callback、Future、事件和ChannelHandler 就是Netty的核心组件。
这些构建块代表了不同类型的构造:资源、逻辑以及通知。
3.1 Channel(通道)
可以把Channel看作是传入(入站)或者传出(出站)数据的载体。因此,它可以被打开或者被关闭,连接或者断开连接。和NIO中的Channel一样,了解过NIO的应该明白。
3.2 Callback(回调)
回调大家都知道是什么意思,Netty在内部使用了回调来处理事件;当一个回调被触发时,相关的事件可以被一个ChannelHandler的实现处理。
下面代码就表示当一个新的连接已经被建立时,ChannelHandler的channelActive()回调方法将会被调用,并将打印出一条信息。
public class TimeServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("Client " + ctx.channel().remoteAddress() + " connected");
}
}
3.3 Future
Future提供了另一种在操作完成时通知应用程序的方式。这个对象可以看作是一个异步操作的结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问。
可能不太好理解,这个Future的意思就是提供一个Future对象给业务人员方便访问异步执行的结果,执行信息等。
比如,点一个外卖,可以通过app查看外卖送到哪里了,距离还有多远,这就类似于Future的效果。
每个Netty的出站I/O操作都将返回一个ChannelFuture;也就是说,它们都不会阻塞。正如我们前面所提到过的一样,Netty完全是异步和事件驱动的。
3.4 事件和ChannelHandler
Netty使用不同的事件来通知我们状态的改变或者是操作的状态。这使得我们能够基于已经发生的事件来触发适当的动作。这些动作可能是:记录日志、数据转换、流控制、应用程序逻辑。
Netty是一个网络编程框架,所以事件是按照它们与入站或出站数据流的相关性进行分类的。可能由入站数据或者相关的状态更改而触发的事件包括:连接已被激活或者连接失活、数据读取、用户事件、错误事件。
出站事件是未来将会触发的某个动作的操作结果,这些动作包括:打开或者关闭到远程节点的连接、将数据写到或者冲刷到套接字。
每个事件都可以被分发给ChannelHandler类中的某个用户实现的方法。这是一个很好的将事件驱动范式直接转换为应用程序构件块的例子。
简单点来说就是每一步操作都要定义一个handler来处理,handler就是处理事件的处理器,比如剪指甲,剪指甲就是事件,指甲剪就是handler,要剪指甲总要先找到一个指甲剪来执行。就是差不多这个道理。
四、小结
可能概念不太好理解,结合入门案例就差不多理解了,刚接触网络编程有点晦涩难懂,多看几遍就好了就理解了。
来源:CSDN
作者:忘不掉就记着吧
链接:https://blog.csdn.net/weiwei_six/article/details/104542327