Netty入门简介
概述
netty是什么?
netty是一个基于java的开源框架,提供了异步的、事件驱动的网络编程框架,用于开发高可用、高可靠性的网络服务器和客户端程序。
netty可以支持多协议,比如FTP、SMTP、HTTP和WebSocket以及其他的基于二进制和基于文本的协议,netty扩展了他的应用范围和灵活性。
Netty核心组件
- Channel
- 回调
- Future
- 事件和ChannelHandler
这些组件组合起来用于处理网络以及流经网络的数据
Channel
它代表一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个能够执行一个或者多个不同的I/O操作的程序组件)的开发连接,比如读操作和写操作。
可以把channel看成是传入或者传出的数据载体,可以被打开或者关闭,连接或者断开连接。
Channel是java NIO中的基本构造,和NIO中的channel是相同的
回调
关于回调的的理解,其实类似于ajax请求结束后,会执行的方法,在netty当中,可以看到大量的使用回调,比如,当一个新的连接建立之后,ChannelHandler中的channelActive()方法将会被调用
当新的连接建立的时候,就会调用这个方法,打印出一条信息
Future
future这个接口在jdk 1.5时候已经存在了,在netty中对future又进行了封装,实现了自己的future-ChannelFuture, 最主要的区别就是添加了监听器,可以在方法执行结束后,进行调用。
对于netty中的方法,只要是返回ChannelFuture毫无疑问这个方法就是非阻塞的
在连接成功之后,会调用里面的方法,如果发生错误也可以把错误信息打印出来,
其实这里的ChannelFutureListener可以看做是回调方法,回调和future是互补的
事件和ChannelHandler
netty可以根据不同的事件来通知我们状态的改变或者是操作的状态,使得我们基于发生的事件来触发指定的操作,可能是记录日志,数据转换,流控制,应用程序逻辑;
根据入站数据或者相关的状态更改触发的事件:
1、连接**或者连接失效;
2、数据读取;
3、用户事件;
4、错误事件;
出站事件是未来将会触发的某个动作的操作,
1、打开或者关闭远程节点的连接;
2、将数据写或者冲刷到套接字;
每个事件都可以分发给具体的ChannelHandler类中的某个用户的实现方法,可以认为每个ChannelHandler的实例都类似于一种为了响应特定事件而被执行的回调。
总结
可以看出netty的异步编程模型,主要是建立在回调和future基础上的,将具体的事件派发到对应的ChannelHandler 上
在netty内部会为每个Channel分配一个EventLoop,用来处理所有的事件,其中包括注册感兴趣的事件,将事件派发给ChannelHandler,安排进一步的动作
EventLoop 本身只有一个线程驱动,其处理了一个Channel 所有的I/O 事件,并且在整个eventLoop的生命周期都不会改变。