1.MINA
MINA 是一个专门设计既能工作在客户端又能工作在服务器端的网络框架
1.1 架构图
1.1.1 应用程序架构
MINA处于应用程序和基础网络层之间作为粘合剂(可以基于TCP、UDP、in-VM 通信或是客户端的RS-232C串行协议),只用在mina上设计自己的应用实现,不需要去处理网络层的复杂业务
(底层是基于JAVA的NIO 1.0实现的)
1.1.2 核心部分架构
内部可以分为3个层次:
- I/O Service - 执行实际的I / O,创建一个I/O Service: 可以选择现成的Services如 (*Acceptor),也可以创建自己的。
- I/O Filter Chain -(I/O过滤器链) 这是一个由多个过滤器组成的过滤器链,在这个环节将字节数据转换到特定的数据结构中,创建一个Filter Chain: 可以从现有的Filter中挑选,或者创建一个用于转换请求/响应的自定义Filter。
- I/O Handler - 实际的业务逻辑部分,创建一个I/O Handler: 编写具体的业务逻辑用于处理不同的消息
(创建一个基于MINA的应用,基本就需要创建出以上3个部分)
1.1.3 服务器端框架
服务器端监听一个端口以获得连入的请求,将其进行处理然后发送回复。服务器端还会为每个客户端 (无论是基于 TCP 还是基于 UDP 协议的) 创建并维护一个 session。
基于MINA框架的Server端应用:
- I/O Acceptor 监听指定的端口,处理新的网络连接。以获取连入的连接或者包--------对于一个新的连接,I/O Acceptor会创建一个新的session ,之后所有来自该 IP 地址/端口号组合的请求会在同一个session 中处理
- 在一个 session 中接收到的所有包,将穿越上图中所示的 Filter Chain (过滤器链)。过滤器可以被用于修正包的内容 (比如转化为对象,添加或者删除信息等等)。通过过滤器将原始的字节码转换成高层的对象,这个环节中 PacketEncoder/Decoder 相当有用。
- 包或转化来的对象最终交给 I/OHandler。I/OHandler 可以用于实现各种具体业务需求。
1.1.4 客户端架构
客户端需要连接到一个服务端,发送消息并处理响应。
- 客户端首先创建一个 I/OConnector (用以连接套接字的 MINA 结构),开启一个服务器的绑定
- 在连接创建时,一个 session 会被创建并关联到该连接
- 应用或者客户端写入 session,导致数据在穿越 Filter Chain (过滤器链) 后被发送给服务器端
- 所有接收自服务器端的响应或者消息穿越 Filter Chain (过滤器链) 后由 I/OHandler 接收并处理
2. I/O Service
IoService 提供了基本的 I/O 服务,并对 MINA 中的 session 进行管理。它是 MINA 架构中的最重要的部分之一。IoService 及其子接口的实现类处理了绝大多数的低层 I/O 操作。
2.1 作用
- session 管理:创建和删除 session,检测闲置 session
- 过滤器链管理:操纵过滤器链,允许用户运行中改变过滤器链
- 处理器调用:接收到新消息时调用处理器,等等
- 统计管理:更新发送消息的数量、发送字节的数量,等等
- 监听器管理:管理用户创建的监听器
- 通信管理:在服务器端和服务器端处理传输的数据
IoService 是所有提供 I/O 服务和管理 I/O session 的 IoConnector 和 IoAcceptor 的基础接口,它被IoConnector 和 IoAcceptor两个类实现。
要构建一个服务器,你需要选择一个 IoAcceptor 接口的实现。对于客户端应用,你需要选择一个 IoConnector 接口的实现。
2.2 I/O Acceptor 服务器端接收连入的连接请求
IoAcceptor 接口是因为 accept() 方法的缘故所命名,这个方法负责客户端和服务器端连接的创建
因为要应对不止一种类型的传输协议,因此这个接口有多个实现类:
- NioSocketAcceptor: 非阻塞套接字传输 IoAcceptor,针对TCP
- NioDatagramAcceptor: 非阻塞 UDP 传输 IoAcceptor,针对UDP
- AprSocketAcceptor: 基于 APR 的阻塞套接字传输 IoAcceptor
- VmPipeSocketAcceptor: in-VM IoAcceptor
2.3 I/O Connector 客户端
这个接口的实现类:
- NioSocketConnector: 非阻塞套接字传输 IoConnector
- NioDatagramConnector: 非阻塞 UDPs 传输 IoConnector
- AprSocketConnector: 基于 APR 的阻塞套接字传输 IoConnector
- ProxyConnector: 一个提供代理支持的 IoConnector
- SerialConnector: 一个用于串行传输的 IoConnector
- VmPipeConnector: in-VM IoConnector
3. Session会话
- 会话处于 MINA 的核心位置:每当一个客户端连接到服务器,一个新的会话会被创建,并会在客户端关掉连接前一直保存在内存中。
- 会话用于保存连接的持久信息,以及在请求处理过程中、会话的生命周期中服务器可能需要用到的任何信息。
3.1 会话的状态
- 已连接:会话已被创建并可用
- 闲置:会话在至少一段时间 (这段时间是可配的) 内没有处理任何请求
- 读闲置:在一段时间内没有任何读操作
- 写闲置:在一段时间内没有任何写操作
- 同时闲置:在一段时间内既没有读操作也没有写操作 - 关闭中:会话正在关闭中 (还有正在清空的消息,清理尚未结束)
- 已关闭:会话现在已被关闭,没有其他方法可以将其恢复。
3.2 配置参数
接收缓冲大小、发送缓冲大小、空闲时间、写超时时间
4. I/O Filter 过滤器
- 它过滤 IoService 和 IoHandler 之间的所有 I/O 事件和请求
4.1 一些常用的过滤器
- LoggingFilter 记录所有事件和请求,日志事件消息,比如 MessageReceived、MessageSent、SessionOpened 等等
- ProtocolCodecFilter 负责对消息进行编码和解码的过滤器,将一个连入的 ByteBuffer 转化为消息 POJO,反之亦然
- CompressionFilter 压缩所有数据
- SSLFilter 添加 SSL - TLS - StartTLS 支持
5. I/O Handler 事件处理器
- 处理 MINA 所触发 I/O 事件,这一接口是在过滤器链最后完成的所有活动的中心。
5.2 事件处理器的具体方法
- sessionCreated 事件 :会话建立事件在一个新的连接被创建时触发,被用于初始化会话属性,并为一些特定连接执行一次性活动
- sessionOpened 事件:会话打开事件是在一个连接被打开时调用。它总是在 sessionCreated 事件之后调用
- sessionClosed 事件:会话关闭事件在会话被关闭时调用。会话清理活动比如支付清理可以在这里执行
- sessionIdle 事件:会话空闲时间在会话变为闲置状态时触发。这一方法并不为基于 UDP 的传输调用
- exceptionCaught 事件:在用户代码或者 MINA 抛异常时调用。如果是一个 IOException 异常的话当前连接将被关闭
- messageReceived 事件: 消息接收事件在一个消息被接收到时触发
- messageSent 事件:消息发送事件在消息响应被发送 (调用 IoSession.write()) 时触发
参考文档:
https://blog.csdn.net/defonds/article/details/18315563 Apache MINA 2.0 用户指南
https://www.cnblogs.com/xiekeli/tag/MINA/ Mina框架研究
https://blog.csdn.net/wangduduzuishuai/article/details/82181592 Mina框架入门讲解