socket通讯mina框架学习与熟悉

1.MINA

MINA 是一个专门设计既能工作在客户端又能工作在服务器端的网络框架

1.1 架构图

1.1.1 应用程序架构

MINA架构图
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端应用:

  1. I/O Acceptor 监听指定的端口,处理新的网络连接。以获取连入的连接或者包--------对于一个新的连接,I/O Acceptor会创建一个新的session ,之后所有来自该 IP 地址/端口号组合的请求会在同一个session 中处理
  2. 在一个 session 中接收到的所有包,将穿越上图中所示的 Filter Chain (过滤器链)。过滤器可以被用于修正包的内容 (比如转化为对象,添加或者删除信息等等)。通过过滤器将原始的字节码转换成高层的对象,这个环节中 PacketEncoder/Decoder 相当有用。
  3. 包或转化来的对象最终交给 I/OHandler。I/OHandler 可以用于实现各种具体业务需求。
1.1.4 客户端架构

客户端需要连接到一个服务端,发送消息并处理响应。
在这里插入图片描述

  1. 客户端首先创建一个 I/OConnector (用以连接套接字的 MINA 结构),开启一个服务器的绑定
  2. 在连接创建时,一个 session 会被创建并关联到该连接
  3. 应用或者客户端写入 session,导致数据在穿越 Filter Chain (过滤器链) 后被发送给服务器端
  4. 所有接收自服务器端的响应或者消息穿越 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框架入门讲解

猜你喜欢

转载自blog.csdn.net/fggsgnhz/article/details/108574089
今日推荐